詳解:從腦波到機器人運動,用深度神經網絡對大腦活動進行解碼

詳解:從腦波到機器人運動,用深度神經網絡對大腦活動進行解碼

原文來源:Towards Data Science

「雷克世界」編譯:嗯~是阿童木呀、KABUDA、EVA

導語:如今,隨著人工智能技術不斷取得突破性進展,越來越多的領域開始使用AI來解決問題。最近,羅馬大學(Sapienza University of Rome)一名學習人工智能與機器人的學生Norman Di Palo,使用深度神經網絡對大腦的腦電波信號進行分析,對大腦活動進行可視化與解碼,以瞭解大腦的活動意圖。而這一研究領域的最終目的是開發出價格合理且有用的假肢設備,通過用大腦控制假肢,以幫助截肢患者重新獲得輕鬆執行基本任務的能力。

神經系統是一個非常複雜的結構。在你的整個身體裡,超過十萬公里的神經將它的每個部分與你的脊髓和大腦相互通信。這個“網格”傳輸控制每一個動作的電脈衝(electrical impulse)。這些命令中的每一條都是從你的大腦開始的,這是一種更加神奇的與電子激活信號(electrical activation signal)進行通信的神經元結構。理解和解釋大腦的電子模式是神經學家和神經生物學家最大的探索之一,但事實證明這是一項極具挑戰性的任務。

腦電圖(electroencephalography,EEG)是一種非侵入性的大腦活動記錄方式。這是一種能夠利用放置在患者頭皮上的電極來記錄腦電壓波動(brain voltage fluctuation)的技術。通常,這些電極中的大約30個被放置在頭皮周圍,這樣即可記錄腦電波的全局活動。無論如何,大腦活動和腦電圖信號之間的關係是很複雜的,在沒有特定實驗室測試的情況下,人們對它知之甚少。有一個巨大的挑戰,就是學習如何“解碼”(在某種意義上)這些腦電圖掃描,這可以使用非侵入性腦-計算機接口(non-invasive brain-computer interface,BCI)來控制機器人假肢和其他設備。

詳解:從腦波到機器人運動,用深度神經網絡對大腦活動進行解碼

用腦電記錄的腦電波的例子,來源:https://commons.wikimedia.org/w/index.php?curid=845554

作為強大的數據驅動的學科,深度學習在相關模式識別(related pattern recognition)任務中的最新突破創造了一種使用神經網絡分析這些電信號的新方法。在本文中,我們將看到這個主題的介紹:我們將閱讀一場Kaggle競賽所提供的腦電圖數據,旨在檢測哪些腦電圖模式與特定的手臂和手勢相對應(例如抓取或舉起物體)。然後我們將設計一個神經網絡,在以不同的方式對數據進行預處理之後執行這樣的分類。我還將展示一些大腦活動的數據可視化(data visualization),以對我們正在使用的數據給出一個大致的理解。這一研究領域的最終目標是開發出價格合理且有用的假肢設備,可以通過用大腦控制假肢,以幫助截肢患者重新獲得輕鬆執行基本任務的能力。類似的技術也可以應用於閱讀肌肉電子激活,從而通過分析激活的肌肉來對一個人正在試圖執行的動作進行解碼。

數據介紹

如果你有Kaggle帳戶,你可以免費下載數據。正如你將看到的,數據是由幾個.csv文件組成的。這些文件,分別是:

· 將腦電圖數據作為模型的輸入,用放置在患者頭皮上的32個電極進行記錄。數據記錄以500赫茲進行記錄。

· 在6種可能的情況之中,人類測試人員試圖實現的運動的框架標籤(Frame-wise label)。

這些數據是通過記錄不同的人類測試人員執行簡單的動作(比如抓取和舉起物體)的腦電圖而收集的。因此,數據集被劃分為不同的場景,也有不同的主題。我們稍後會看到,在精確度預測中,腦電波可能是相當個人化的,因為模型可以非常精確地預測同一個人在不可見場景中的意圖,但是如果訓練不夠充分的話,它們也可能很難在新的測試人員身上做同樣的事情。

因此,我們的目標是創建一個神經網絡,它將腦電波讀數作為輸入,並輸出測試人員正在試圖執行的這6個可能動作的概率分佈。由於“無動作”不是一個可能的類,所以我們可以將其作為一個類添加或者將所有可能的輸出設置為0到1之間的值,並使用閾值來決定是否檢測到該動作。如果每一個動作都在閾值之下,則我們認為它是無動作。

詳解:從腦波到機器人運動,用深度神經網絡對大腦活動進行解碼

電極位置,來源:https://www.kaggle.com/c/grasp-and-lift-eeg-detection/data

為了更好地進行說明,我做了這些電極活動的動畫數據可視化圖。由於採樣頻率非常高(500 Hz),我使用一個簡單的3步低通濾波器(low pass filter)來平滑數據,並創建了前100幀的動畫,即大約1/5秒。

詳解:從腦波到機器人運動,用深度神經網絡對大腦活動進行解碼

在第一個1/5秒內激活32個電極

我們還可以將時間數據可視化為一個2D熱圖,其中,縱軸是時間(從頂部開始並不斷向下),橫軸表示32個電極。

詳解:從腦波到機器人運動,用深度神經網絡對大腦活動進行解碼

腦電圖時域熱圖(時間從頂部開始並不斷向下)

這也是非常有用的,因為我們將會看到,它將使得我們能夠使用時空卷積(spatio-temporal convolutions)。

數據預處理

這些原始數據應該進行預處理,以便使學習階段變得更為成熟。例如,相較於已執行動作的相對較低的變化率,EEG的非常高的採樣頻率可能會導致許多問題:數據變化非常快,但動作實際上保持不變,因此波動幾乎可以被人為是噪聲。此外,時間模型會收到很多快速變化的數據,而分類輸出永遠不會改變。

第一個可能的步驟是用低通濾波器對數據進行過濾。即使是一個簡單的運行平均值也能起作用:通過這種方式,我們減輕了數據的高頻變化,同時保留了更加有用的低頻結構,因為我們即將對其進行分類的動作的變化頻率非常低(最多1Hz)。之後,我們可以對數據進行二次採樣,也就是說,每10,100次只能保留一個數據點,等等。這也有助於減少時間維度並降低數據的相關性,從而使其從某種意義上說,使得時間更稀疏。

我們可以採用許多其他預處理技術,但是為了簡單起見,我們可以在這裡停下來,並開始設計我們的神經網絡。

神經網絡設計與實驗

處理時態數據時,我們首先想到的結構就是循環神經網絡。這些網絡具有動態結構,內部狀態允許它們對時態數據進行編碼,因此它們也基於過去的輸入來計算它們的輸出。我基於Keras設計了一個長短期記憶網絡(LSTM),並且採用時序結構將訓練數據輸入至LSTM網絡中。結果是好的,但在這個特殊的例子中,我更感興趣的是展示一個經常用於圖像的卷積神經網絡,是如何很好地處理時態數據的。

詳解:從腦波到機器人運動,用深度神經網絡對大腦活動進行解碼

正如前面所描述的,從某種意義上來講,我們實際是在處理時空數據(spatio-temporal data):上面的縱座標表示熱圖的時間演變,而橫座標表示各種電極,相鄰的電極幾乎總是在人類頭皮上的物理空間中相接近。這意味著我們實際上可以通過卷積來提取有用的特徵:2D內核將在時間和空間上對模式進行編碼。設想一個3×3卷積內核:在熱圖描述的矩陣上,它可以通過在3個不同的時間步長(3個內核行)上進行加權求和來提取特徵值,但也可以在3個不同的電極(3個內核列)上提取特徵。因此,具有許多內核的CNN可以發現電極激活是如何在有限的時間週期內改變與目標動作相關的特徵的。

我在Keras中實現了一個簡單的CNN來檢查它在這個數據集中的性能。你可以在Colaboratory Notebook(https://colab.research.google.com/drive/1lDfmXMo7_mcVBo9EAtgLNIgeJV50GTce#scrollTo=AFoTOqC-4Rjl)中找到本文的所有代碼,並且可以在瀏覽器中直接運行代碼。這是GitHub repo(https://github.com/normandipalo/eeg-to-action)。

import keras

from keras.models import Sequential

from keras.layers import Dense, Dropout

from keras.layers import Embedding

from keras.layers import LSTM, CuDNNLSTM, BatchNormalization, Conv2D, Flatten, MaxPooling2D, Dropout

from keras.optimizers import Adam

model = Sequential()

#model.add(CuDNNLSTM(128, input_shape = (time_steps//subsample, 32)))

model.add(Conv2D(filters = 64, kernel_size = (7,7), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))

model.add(BatchNormalization())

#model.add(MaxPooling2D(pool_size = (3,3)))

model.add(Conv2D(filters = 64, kernel_size = (5,5), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))

model.add(BatchNormalization())

#model.add(MaxPooling2D(pool_size = (3,3)))

model.add(Conv2D(filters = 64, kernel_size = (3,3), padding = "same", activation = "relu", input_shape = (time_steps//subsample, 32, 1)))

model.add(BatchNormalization())

#model.add(MaxPooling2D(pool_size = (3,3)))

model.add(Flatten())

#model.add(Dropout(0.2))

model.add(Dense(32, activation = "relu"))

model.add(BatchNormalization())

# model.add(Dropout(0.2))

model.add(Dense(6, activation = "sigmoid"))

adam = Adam(lr = 0.001)

model.compile(optimizer = adam, loss = "categorical_crossentropy", metrics = ["accuracy"])

model.summary()

正如在Kaggle競賽中建議的那樣,為了檢驗我們的模型性能,我們檢查了AUC分數。如果你不瞭解AUC的含義,我建議你從這裡查看清晰直觀的解釋(https://datascience.stackexchange.com/questions/806/advantages-of-auc-vs-standard-accuracy)。正如你可以通過在線筆記本自己檢查一樣,經過快速訓練階段,我們AUC分數可達0.85左右。

通過訓練不同的神經網絡結構,以及預處理技術等,可以實現許多改進,但這一概念的引入證明了神經網絡從這種數據中學習的顯著能力。

結論

本文中,我們使用腦電圖介紹了腦電信號,這是一種可以記錄用戶頭皮的有用信號的非入侵性,且相對簡單的方法。我們看到了一些直觀的數據可視化,以及如何使用神經網絡從中提取運動意向等特徵。我相信,這一領域(機器人假體、腦機接口)將會得到深入推動,這要感謝每年都在提高的深度學習及更廣泛的各種科學技術,以及不斷增長的平臺和競爭。

詳解:從腦波到機器人運動,用深度神經網絡對大腦活動進行解碼

這些技術的影響將是巨大的。擁有可以自然控制的低成本假肢能夠顯著改善數百萬人的生活(https://web.stanford.edu/class/engr110/2011/LeBlanc-03a.pdf)。

詳解:從腦波到機器人運動,用深度神經網絡對大腦活動進行解碼

我建議你去看一下Symbionic項目(https://medium.com/symbionic-project),這是一個近期剛開始的項目,一群富有才華的人試圖通過肌肉激活來控制低成本、智能的手臂假肢,從而使這種設備可以得到廣泛的普及與應用。

原文鏈接:https://towardsdatascience.com/from-brain-waves-to-arm-movements-with-deep-learning-an-introduction-3c2a8b535ece


分享到:


相關文章: