轉(zhuǎn)載請(qǐng)注明作者:夢(mèng)里風(fēng)林
Github工程地址:https://github.com/ahangchen/GDLnotes
歡迎star,有問(wèn)題可以到Issue區(qū)討論
官方教程地址
視頻/字幕下載
text8中只包括27種字符:小寫(xiě)的從a到z,和空格符。如果把它打出來(lái),讀起來(lái)就像是去掉了所有標(biāo)點(diǎn)的wikipedia。
達(dá)成隨機(jī)取數(shù)據(jù)的目標(biāo)
embeddings = tf.Variable(
tf.random_uniform([vocabulary_size, embedding_size], -1.0, 1.0))
embed = tf.nn.embedding_lookup(embeddings, train_dataset)
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)
自適應(yīng)梯度調(diào)理器,調(diào)理embedding列表的數(shù)據(jù),使得偏差最小
預(yù)測(cè),并用cos值計(jì)算預(yù)測(cè)向量與實(shí)際數(shù)據(jù)的夾角作為預(yù)測(cè)準(zhǔn)確度(類似度)指標(biāo)
data_index = (data_index + 1) % len(data)
實(shí)現(xiàn)代碼見(jiàn)word2vec.py
上面訓(xùn)練的是Skip-gram模型,是根據(jù)目標(biāo)辭匯預(yù)測(cè)上下文,而word2vec還有1種方式,CBOW,根據(jù)上下文預(yù)測(cè)目標(biāo)辭匯。
實(shí)際上就是將Skip-gram中的輸入輸出反過(guò)來(lái)。
修改截取數(shù)據(jù)的方式
分別從embeding里找到train_data里每一個(gè)word對(duì)應(yīng)的vector,用tf.reduce_sum將其相加,將相加結(jié)果與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)
代碼見(jiàn):
cbow.py
整體思路是,以1個(gè)文本中的1個(gè)詞作為train data,后續(xù)的所有詞作為train label,從而能夠根據(jù)1個(gè)給定詞,預(yù)測(cè)后續(xù)的片斷。
input_gate = sigmoid(i * ix + o * im + ib)
- 給輸入乘1個(gè)vocabulary_size * num_nodes大小的矩陣,給輸出乘1個(gè)num_nodes * num_nodes大小的矩陣;
- 用這兩個(gè)矩陣調(diào)理對(duì)輸入數(shù)據(jù)的取舍程度
- 用sigmoid這個(gè)非線性函數(shù)進(jìn)行激活
forget_gate = sigmoid(i * fx + o * fm + fb)
思路同輸入門(mén),用以對(duì)歷史數(shù)據(jù)做取舍
output_gate = sigmoid(i * ox + o * om + ob)
思路同輸入門(mén),用以對(duì)輸出狀態(tài)做取舍
update = i * cx + o * cm + cb
state = forget_gate * state + input_gate * tanh(update)
lstm_cell = output_gate * tanh(state)
- 用一樣的方式構(gòu)造新?tīng)顟B(tài)update
- 用遺忘門(mén)處理歷史狀態(tài)state
- 用tanh激活新?tīng)顟B(tài)update
- 用輸入門(mén)處理新?tīng)顟B(tài)update
- 整合新舊狀態(tài),再用tanh激活狀態(tài)state
- 用輸出門(mén)處理state
上面的cell中,update,output_gate,forget_gate,input_gate計(jì)算方法都是1樣的,
可以把4組參數(shù)分別合并,1次計(jì)算,再分別取出:
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個(gè)WX+b中調(diào)劑作為輸出
實(shí)現(xiàn)代碼見(jiàn)singlew_lstm.py
實(shí)現(xiàn)代碼見(jiàn)lstm.py
上面的流程里,每次都是以1個(gè)字符作為單位,可使用多1點(diǎn)的字符做預(yù)測(cè),取最高幾率的那個(gè),避免特殊情況致使的誤判
在這里我們?cè)黾幼址麨?個(gè),構(gòu)成bigram,代碼見(jiàn):bigram_lstm.py
主要通過(guò)BigramBatchGenerator類實(shí)現(xiàn)
由于bigram情況下,vocabulary_size變成 27*27個(gè),使用one-hot encoding 做predict的話會(huì)產(chǎn)生非常稀疏的矩陣,浪費(fèi)算力,計(jì)算速度慢
因此引入embedding_lookup,代碼見(jiàn)embed_bigram_lstm.py
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
覺(jué)得我的文章對(duì)您有幫助的話,無(wú)妨點(diǎn)個(gè)star?
上一篇 安卓應(yīng)用版本升級(jí)時(shí)sqlit數(shù)據(jù)庫(kù)升級(jí)
下一篇 Mybatis自動(dòng)創(chuàng)建表/更新表結(jié)構(gòu)/動(dòng)態(tài)建表