神經網路學習筆記

2021-09-02 02:38:45 字數 2360 閱讀 9473

《python神經網路程式設計》這本書只認真讀完了第一章,大概80頁內容,就是簡單介紹了下三層前饋神經網路,以及推導了利用梯度下降法來反向傳播誤差,更新權重,即誤逆差傳播法(error backpropagation, bp)。有點基礎的,這本書還是不推薦買了,完全可以直接閱讀《深度學習》(周志華)第5章神經網路的內容。

參考這篇翻譯的部落格

知識點:

(1) nlp裡的卷積和池化

影象裡的卷積核多是正方形的,假如影象提取的畫素是n*m, 卷積核(filter)是k*k,在寬度和高度上同時移動,通常會得到(n-k+1)*(m-k+1)的矩陣,目標是降維。但是文字裡,如果單詞embedding的長度是m,假設文字有n個單詞,則初始特徵矩陣是n*m,卷積核的寬度和embedding的長度一致是m,高度設定為window_size,則卷積核只在高度上移動,這樣每次視窗滑動過的位置都是完整的單詞,不會將幾個單詞的一部分「vector」進行卷積,這也保證了word作為語言中最小粒度的合理性。這樣卷積後得到的結果是乙個一維向量,大小為[n-window_size+1, 1]。在經過池化(max-pooling)之後可能是乙個標量。

為了將標量變成向量,同乙個window_size的卷積核(filter)設定了多個(128個之類的),可以組合(拼接)成乙個向量作為feature_vector。window_size通常也會設定多個[3,4,5],最後再將所有window_size下的feature_vector也組合成乙個single vector,作為全連線層的輸入。

# create a convolution + maxpool layer for each filter size

pooled_outputs =

for i, filter_size in enumerate(filter_sizes):

with tf.name_scope("conv-maxpool-%s" % filter_size):

# convolution layer

filter_shape = [filter_size, embedding_size, 1, num_filters]

w = tf.variable(tf.truncated_normal(filter_shape, stddev=0.1), name="w")

b = tf.variable(tf.constant(0.1, shape=[num_filters]), name="b")

conv = tf.nn.conv2d(

self.embedded_chars_expanded,

w,strides=[1, 1, 1, 1],

padding="valid"

name="conv")

h = tf.nn.relu(tf.nn.bias_add(conv, b), name="relu")

# maxpooling over the outputs

pooled = tf.nn.max_pool(

h,ksize=[1, sequence_length - filter_size + 1, 1, 1],

strides=[1, 1, 1, 1]

padding='valid',

name="pool")

# combine all the pooled features

num_filters_total = num_filters * len(filter_sizes)

self.h_pool = tf.concat(pooled_outputs, 3)

self.h_pool_flat = tf.reshape(self.h_pool, [-1, num_filters_total])

(2) embedding的實現方式

每個id(詞)對應的向量是均勻分布的,值在[-1, 1]。樣例中的詞表vacabulary size是18758個,所以w的shape = (18758, 128)。

self.w = tf.variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0), name="w")
每條訓練資料預設是56個id(詞),tf.nn.embedding_lookup()就是根據input_ids中的id,尋找embeddings,即self.w中的第id行。比如input_ids=[1,3,5],則找出embeddings中第1,3,5行,組成乙個tensor返回,tensor的shape = (56, 128),即每條訓練資料的經過embedding之後的矩陣是56 * 128

self.embedded_chars = tf.nn.embedding_lookup(self.w, self.input_x)

神經網路學習筆記

隱含層數越多,越容易擬合複雜函式 為了擬合複雜函式需要的隱含節點數目,基本上隨著隱含層數目的增加呈現指數下降的趨勢,也就是說層數越多,神經網路所需要的隱含節點可以越少。層數越深,概念越抽象,需要背誦的知識點 神經網路的隱含節點 就越少。但是,層數越多,容易出現過擬合以及引數難以除錯以及梯度瀰散的問題...

神經網路學習筆記

sigmoid函式是一種常見的擠壓函式,其將較大範圍的輸入擠壓到 0 1 區間內,其函式的表示式與形狀如下圖所示 該函式常被用於分類模型,因為其具有很好的乙個特性f x f x 1 f x 這個函式也會被用於下面的神經網路模型中做啟用函式。生物的神經網路系統中,最簡單最基本的結構是神經元。每個神經元...

神經網路 學習筆記

神經網路是用來解決分類問題的模型。他與感知機有著緊密的聯絡。神經網路中,神經元接收到的總輸入將與神經元的閾值進行比較,然後通過 啟用函式 處理以產生神經元的輸出。最理想的啟用函式是階躍函式,但是他不連續,不光滑,所以,採用sigmoid函式來進行替代。感知機只有輸出層神經元進行啟用函式處理,即只擁有...