多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 服務器 > Google深度學習筆記 循環神經網絡實踐

Google深度學習筆記 循環神經網絡實踐

來源:程序員人生   發布時間:2016-08-09 08:10:46 閱讀次數:3937次

轉載請注明作者:夢里風林
Github工程地址:https://github.com/ahangchen/GDLnotes
歡迎star,有問題可以到Issue區討論
官方教程地址
視頻/字幕下載

加載數據

  • 使用text8作為訓練的文本數據集

text8中只包括27種字符:小寫的從a到z,和空格符。如果把它打出來,讀起來就像是去掉了所有標點的wikipedia。

  • 直接調用lesson1中maybe_download下載text8.zip
  • 用zipfile讀取zip內容為字符串,并拆分成單詞list
  • 用connections模塊統計單詞數量并找出最多見的單詞

達成隨機取數據的目標

構造計算單元

embeddings = tf.Variable( tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
  • 構造1個vocabulary_size x embedding_size的矩陣,作為embeddings容器,
  • 有vocabulary_size個容量為embedding_size的向量,每一個向量代表1個vocabulary,
  • 每一個向量的中的份量的值都在⑴到1之間隨機散布
embed = tf.nn.embedding_lookup(embeddings, train_dataset)
  • 調用tf.nn.embedding_lookup,索引與train_dataset對應的向量,相當于用train_dataset作為1個id,去檢索矩陣中與這個id對應的embedding
loss = tf.reduce_mean( tf.nn.sampled_softmax_loss(softmax_weights, softmax_biases, embed, train_labels, num_sampled, vocabulary_size))
  • 采樣計算訓練損失
optimizer = tf.train.AdagradOptimizer(1.0).minimize(loss)
  • 自適應梯度調理器,調理embedding列表的數據,使得偏差最小

  • 預測,并用cos值計算預測向量與實際數據的夾角作為預測準確度(類似度)指標

傳入數據進行訓練

  • 切割數據用于訓練,其中:
data_index = (data_index + 1) % len(data)
  • 照舊是每次取1部份隨機數據傳入
    • 等距離截取1小段文本
    • 構造訓練集:每一個截取窗口的中間位置作為1個train_data
    • 構造標簽:每一個截取窗口中,除train_data以外的部份,隨機取幾個成為1個list,作為label(這里只隨機取了1個)
    • 這樣就構成了根據目標辭匯預測上下文的機制,即Skip-gram
  • 訓練100001次,每2000次輸出這兩千次的平均損失
  • 每10000次計算類似度,并輸出與驗證集中的詞最接近的辭匯列表
  • 用tSNE降維顯現辭匯接近程度
  • 用matplotlib繪制結果

實現代碼見word2vec.py

CBOW

上面訓練的是Skip-gram模型,是根據目標辭匯預測上下文,而word2vec還有1種方式,CBOW,根據上下文預測目標辭匯。

實際上就是將Skip-gram中的輸入輸出反過來。

  • 修改截取數據的方式

    • 構造標簽:每一個截取窗口的中間位置作為1個train_label
    • 構造訓練集:每一個截取窗口中,除train_label以外的部份,作為train_data(這里只隨機取了1個)
    • 這樣就構成了根據上下文預測目標辭匯的機制,即CBOW
  • 分別從embeding里找到train_data里每一個word對應的vector,用tf.reduce_sum將其相加,將相加結果與train_label比較

# Look up embeddings for inputs. embed = tf.nn.embedding_lookup(embeddings, train_dataset) # sum up vectors on first dimensions, as context vectors embed_sum = tf.reduce_sum(embed, 0)
  • 訓練中照舊是調理embeding的參數來優化loss
  • 訓練結果以下圖,可以看到不同單詞的接近程度

代碼見:
cbow.py

RNN 造句

整體思路是,以1個文本中的1個詞作為train data,后續的所有詞作為train label,從而能夠根據1個給定詞,預測后續的片斷。

訓練數據

  • BatchGenerator
    • text: 全部的文本數據
    • text_size:全部文本的字符串長度
    • batch_size:每段訓練數據的大小
    • num_unrollings:要生成的訓練數據段的數目
    • segment:全部訓練數據集可以分成幾個訓練數據片斷
    • cursor:重要,
    • 1開始記錄每一個訓練數據片斷的起始位置坐標,即這個片斷位于text的哪一個index
    • 履行next_batch生成1個訓練數據的時候,游標會從初始位置自增,直到取夠batch_size個數據
    • last_batch:上1個訓練數據片斷
    • 每調用1次next,生成1個num_unrollings長的array,以last_batch開頭,隨著num_unrollings個batch
    • 每一個batch的作為train_input,每一個batch后面的1個batch作為train_label,每一個step訓練num_unrolling個batch

lstm-cell

  • 為了解決消失的梯度問題,引入lstm-cell,增強model的記憶能力
  • 根據這篇論文設計lstm-cell: http://arxiv.org/pdf/1402.1128v1.pdf
  • 分別有3個門:輸入門,遺忘門,輸出門,構成1個cell
    • 輸入數據是num_nodes個詞,可能有vocabulary_size種詞
    • 輸入門:
input_gate = sigmoid(i * ix + o * im + ib)
- 給輸入乘1個vocabulary_size * num_nodes大小的矩陣,給輸出乘1個num_nodes * num_nodes大小的矩陣;
- 用這兩個矩陣調理對輸入數據的取舍程度
- 用sigmoid這個非線性函數進行激活
  • 遺忘門:
forget_gate = sigmoid(i * fx + o * fm + fb)

思路同輸入門,用以對歷史數據做取舍

  • 輸出門:
output_gate = sigmoid(i * ox + o * om + ob)

思路同輸入門,用以對輸出狀態做取舍

  • 組合:
update = i * cx + o * cm + cb state = forget_gate * state + input_gate * tanh(update) lstm_cell = output_gate * tanh(state)
- 用一樣的方式構造新狀態update
- 用遺忘門處理歷史狀態state
- 用tanh激活新狀態update
- 用輸入門處理新狀態update
- 整合新舊狀態,再用tanh激活狀態state
- 用輸出門處理state

lstm優化

上面的cell中,update,output_gate,forget_gate,input_gate計算方法都是1樣的,
可以把4組參數分別合并,1次計算,再分別取出:

values = tf.split(1, gate_count, tf.matmul(i, input_weights) + tf.matmul(o, output_weights) + bias) input_gate = tf.sigmoid(values[0]) forget_gate = tf.sigmoid(values[1]) update = values[2]

再將lstm-cell的輸出扔到1個WX+b中調劑作為輸出

實現代碼見singlew_lstm.py

Optimizer

  • 采取one-hot encoding作為label預測
  • 采取交叉熵計算損失
  • 引入learning rate decay

Flow

  • 填入訓練數據到placeholder中
  • 驗證集的準確性用logprob來計算,即對可能性取對數
  • 每10次訓練隨機挑取5個字母作為起始詞,進行造句測試
  • 你可能注意到輸出的sentence是由sample得到的詞組成的,而非選擇幾率最高的詞,這是由于,如果1直取幾率最高的詞,最后會1直重復這個幾率最高的詞

實現代碼見lstm.py

上面的流程里,每次都是以1個字符作為單位,可使用多1點的字符做預測,取最高幾率的那個,避免特殊情況致使的誤判

在這里我們增加字符為2個,構成bigram,代碼見:bigram_lstm.py

主要通過BigramBatchGenerator類實現

Embedding look up

由于bigram情況下,vocabulary_size變成 27*27個,使用one-hot encoding 做predict的話會產生非常稀疏的矩陣,浪費算力,計算速度慢

因此引入embedding_lookup,代碼見embed_bigram_lstm.py

  • 數據輸入:BatchGenerator不再生成one-hot-encoding的向量作為輸入,而是直接生成bigram對應的index列表
  • embedding look up調劑embedding,使bigram與vector對應起來
  • 將embedding look up的結果喂給lstm cell便可
  • 輸出時,需要將label和output都轉為One-hot-encoding,才能用交叉熵和softmax計算損失
  • 在tensor里做data到one-hot-encoding轉換時,主要依賴tf.gather函數
  • 在對valid數據做轉換時,主要依賴one_hot_voc函數

Drop out

  • 在lstm cell中對input和output做drop out
  • Refer to this article

Seq2Seq

  • 最后1個問題是,將1個句子中每一個詞轉為它的逆序字符串,也就是1個seq到seq的轉換
  • 正經的實現思路是,word 2 vector 2 lstm 2 vector 2 word
  • 不過tensorflow已有了這樣1個模型來做這件事情:Seq2SeqModel,關于這個模型可以看這個分析
    和tensorflow的example
  • 只需要從batch中,根據字符串逆序的規律生成target sequence,放到seq2seqmodel里便可,主要依賴rev_id函數
  • 實現見seq2seq.py
  • 注意,用Seq2SeqModel的時候,size和num_layer會在學習到正確的規律前就收斂,我把它調大了1點
def create_model(sess, forward_only): model = seq2seq_model.Seq2SeqModel(source_vocab_size=vocabulary_size, target_vocab_size=vocabulary_size, buckets=[(20, 21)], size=256, num_layers=4, max_gradient_norm=5.0, batch_size=batch_size, learning_rate=1.0, learning_rate_decay_factor=0.9, use_lstm=True, forward_only=forward_only) return model
  • 參數含義
    • source_vocab_size: size of the source vocabulary.
    • target_vocab_size: size of the target vocabulary.
    • buckets: a list of pairs (I, O), where I specifies maximum input length
      that will be processed in that bucket, and O specifies maximum output
      length. Training instances that have inputs longer than I or outputs
      longer than O will be pushed to the next bucket and padded accordingly.
      We assume that the list is sorted, e.g., [(2, 4), (8, 16)].
    • size: number of units in each layer of the model.
    • num_layers: number of layers in the model.
    • max_gradient_norm: gradients will be clipped to maximally this norm.
    • batch_size: the size of the batches used during training;
      the model construction is independent of batch_size, so it can be
      changed after initialization if this is convenient, e.g., for decoding.
    • learning_rate: learning rate to start with.
    • learning_rate_decay_factor: decay learning rate by this much when needed.
    • use_lstm: if true, we use LSTM cells instead of GRU cells.
    • num_samples: number of samples for sampled softmax.
    • forward_only: if set, we do not construct the backward pass in the model.

參考鏈接

  • 林洲漢-知乎
  • 詞向量
  • rudolfix - udacity_deeplearn
  • Edwardbi - 解析Tensorflow官方English-Franch翻譯器demo

覺得我的文章對您有幫助的話,無妨點個star?

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 高清不卡免费一区二区三区 | 国产精品99久久久久久夜夜嗨 | 欧美美女xx| 精品久久久久久中文字幕一区 | 精品国产免费人成在线观看 | 狠狠色综合网 | 久久网站免费 | 在线观看一级毛片免费 | 爱爱小视频免费体验区在线观看 | 伊久久| 国产免费高清 | 女人18一级特级毛片免费看 | 欧美巨大xxxx做受孕妇视频 | 精品亚洲在线 | 欧美一区二区三区精品 | 午夜男人视频 | 最近最新中文字幕免费的一页 | 在线播放网站 | 欧洲美女人牲交一级毛片 | 亚洲国产亚洲片在线观看播放 | 视频免费视频观看网站 | 地址一地址二地址三 | 日韩国产欧美在线观看 | 桃花福利视频在线观看 | 久久精品国产亚洲aa | 久久精品8 | 久久亚洲国产视频 | 性xxxx欧美 | 国产成人精品一区二区免费视频 | 欧美色视频网 | 亚洲欧美综合国产精品一区 | 九九涩 | 亚欧成人在线 | 亚洲精品永久www忘忧草 | 精品日韩欧美国产一区二区 | 久久久亚洲精品国产 | 一区二区三区四区国产 | 日本高清www免费视频软件 | 97影院午夜在线观看琪琪 | 国产精品一国产精品 | 国产的一级毛片完整 |