《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,作為全連線層的輸入。
(2) embedding的實現方式# 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])
每個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函式來進行替代。感知機只有輸出層神經元進行啟用函式處理,即只擁有...