人工神經(jīng)網(wǎng)絡(luò),借鑒生物神經(jīng)網(wǎng)絡(luò)工作原理數(shù)學(xué)模型苇瓣。
由n個(gè)輸入特征得出與輸入特征幾乎相同的n個(gè)結(jié)果尉间,訓(xùn)練隱藏層得到意想不到信息。信息檢索領(lǐng)域击罪,模型訓(xùn)練合理排序模型哲嘲,輸入特征,文檔質(zhì)量外邓、文檔點(diǎn)擊歷史撤蚊、文檔前鏈數(shù)目、文檔錨文本信息损话,為找特征隱藏信息侦啸,隱藏層神經(jīng)元數(shù)目設(shè)置少于輸入特征數(shù)目,經(jīng)大量樣本訓(xùn)練能還原原始特征模型丧枪,相當(dāng)用少于輸入特征數(shù)目信息還原全部特征光涂,壓縮,可發(fā)現(xiàn)某些特征之間存在隱含相關(guān)性拧烦,或者有某種特殊關(guān)系忘闻。讓隱藏層神經(jīng)元數(shù)目多余輸入特征數(shù)目,訓(xùn)練模型可展示特征之間某種細(xì)節(jié)關(guān)聯(lián)恋博。輸出輸入一致齐佳,自編碼算法私恬。
人工神經(jīng)網(wǎng)絡(luò)模型,多層神經(jīng)元結(jié)構(gòu)建立炼吴,每一層抽象一種思維過程本鸣,經(jīng)多層思考,得出結(jié)論硅蹦。神經(jīng)網(wǎng)絡(luò)每一層有每一層專做事情荣德,每一層神經(jīng)元添加特殊約束條件。多層提取特定特征做機(jī)器學(xué)習(xí)是深度學(xué)習(xí)童芹。
卷積玷或,在一定范圍內(nèi)做平移并求平均值宛徊。卷積積分公式颅湘,對(duì)τ積分损拢,對(duì)固定x舞竿,找x附近所有變量蝉绷,求兩個(gè)函數(shù)乘積田度,并求和默怨。神經(jīng)網(wǎng)絡(luò)里面,每個(gè)神經(jīng)元計(jì)算輸出卷積公式久锥,神經(jīng)網(wǎng)絡(luò)每一層輸出一種更高級(jí)特征。自然語言异剥,較近上下文詞語之間存在一定相關(guān)性瑟由,標(biāo)點(diǎn)、特殊詞等分隔使冤寿、傳統(tǒng)自然語言處理脫離詞與詞之間關(guān)聯(lián)歹苦,丟失部分重要信息,利用卷積神經(jīng)網(wǎng)絡(luò)可以做多元(n-gram)計(jì)算督怜,不損失自然語言臨近詞相關(guān)性信息殴瘦。
自動(dòng)問答系統(tǒng)深度學(xué)習(xí)應(yīng)用RNN,利用時(shí)序建模号杠。
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)蚪腋,二維離散卷積運(yùn)算和人工神經(jīng)網(wǎng)絡(luò)結(jié)合深度神經(jīng)網(wǎng)絡(luò)。自動(dòng)提取特征姨蟋。
手寫數(shù)字識(shí)別屉凯。http://yann.lecun.com/exdb/mnist/手寫數(shù)據(jù)集,文件是二進(jìn)制像素單位保存幾萬張圖片文件眼溶,https://github.com/warmheartli/ChatBotCourse悠砚。
多層卷積網(wǎng)絡(luò),第一層一個(gè)卷積和一個(gè)max pooling堂飞,卷積運(yùn)算“視野”5×5像素范圍灌旧,卷積使用1步長(zhǎng)绑咱、0邊距模板(保證輸入輸出同一個(gè)大小),1個(gè)輸入通道(圖片灰度枢泰,單色)羡玛,32個(gè)輸出通道(32個(gè)特征)。每張圖片28×28像素宗苍,第一次卷積輸出28×28大小稼稿。max pooling采用2×2大小模板,池化后輸出尺寸14×14讳窟,一共有32個(gè)通道让歼,一張圖片輸出是14×14×32=6272像素。第二層一個(gè)卷積和一個(gè)max pooling丽啡,輸入通道32個(gè)(對(duì)應(yīng)第一層32個(gè)特征)谋右,輸出通道64個(gè)(輸出64個(gè)特征),輸入每張大小14×14补箍,卷積層輸出14×14改执,經(jīng)過max pooling,輸出大小7×7坑雅,輸出像素7×7×64=3136辈挂。第三層一個(gè)密集連接層,一個(gè)有1024個(gè)神經(jīng)元全連接層裹粤,第二層輸出7×7×64個(gè)值作1024個(gè)神經(jīng)元輸入终蒂。神經(jīng)元激活函數(shù)為ReLu函數(shù),平滑版Softplus g(x)=log(1+e^x))遥诉。最終輸出層拇泣,第三層1024個(gè)輸出為輸入,設(shè)計(jì)一個(gè)softmax層矮锈,輸出10個(gè)概率值霉翔。
# coding:utf-8
import sys
import importlib
importlib.reload(sys)
from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_string('data_dir', './', 'Directory for storing data')
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)
# 初始化生成隨機(jī)的權(quán)重(變量),避免神經(jīng)元輸出恒為0
def weight_variable(shape):
# 以正態(tài)分布生成隨機(jī)值
initial = tf.truncated_normal(shape, stddev=0.1)
return tf.Variable(initial)
# 初始化生成隨機(jī)的偏置項(xiàng)(常量)苞笨,避免神經(jīng)元輸出恒為0
def bias_variable(shape):
initial = tf.constant(0.1, shape=shape)
return tf.Variable(initial)
# 卷積采用1步長(zhǎng)债朵,0邊距,保證輸入輸出大小相同
def conv2d(x, W):
return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
# 池化采用2×2模板
def max_pool_2x2(x):
return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='SAME')
# 28*28=784
x = tf.placeholder(tf.float32, [None, 784])
# 輸出類別共10個(gè):0-9
y_ = tf.placeholder("float", [None,10])
# 第一層卷積權(quán)重猫缭,視野是5*5葱弟,輸入通道1個(gè),輸出通道32個(gè)
W_conv1 = weight_variable([5, 5, 1, 32])
# 第一層卷積偏置項(xiàng)有32個(gè)
b_conv1 = bias_variable([32])
# 把x變成4d向量猜丹,第二維和第三維是圖像尺寸芝加,第四維是顏色通道數(shù)1
x_image = tf.reshape(x, [-1,28,28,1])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
h_pool1 = max_pool_2x2(h_conv1)
# 第二層卷積權(quán)重,視野是5*5,輸入通道32個(gè)藏杖,輸出通道64個(gè)
W_conv2 = weight_variable([5, 5, 32, 64])
# 第二層卷積偏置項(xiàng)有64個(gè)
b_conv2 = bias_variable([64])
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
h_pool2 = max_pool_2x2(h_conv2)
# 第二層池化后尺寸編程7*7将塑,第三層是全連接,輸入是64個(gè)通道蝌麸,輸出是1024個(gè)神經(jīng)元
W_fc1 = weight_variable([7 * 7 * 64, 1024])
# 第三層全連接偏置項(xiàng)有1024個(gè)
b_fc1 = bias_variable([1024])
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
# 按float做dropout点寥,以減少過擬合
keep_prob = tf.placeholder("float")
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
# 最后的softmax層生成10種分類
W_fc2 = weight_variable([1024, 10])
b_fc2 = bias_variable([10])
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
# Adam優(yōu)化器來做梯度最速下降
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
for i in range(20000):
batch = mnist.train.next_batch(50)
if i%100 == 0:
train_accuracy = accuracy.eval(feed_dict={
x:batch[0], y_: batch[1], keep_prob: 1.0})
print("step %d, training accuracy %g"%(i, train_accuracy))
train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
print("test accuracy %g"%accuracy.eval(feed_dict={
x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))
詞向量。自然語言需要數(shù)學(xué)化才能被計(jì)算機(jī)認(rèn)識(shí)計(jì)算来吩。為每個(gè)詞分配一個(gè)編號(hào)敢辩,不能表示詞與詞關(guān)系。每一個(gè)詞對(duì)應(yīng)一個(gè)向量弟疆,詞義相近詞戚长,詞向量距離越近(歐氏距離、夾角余弦)怠苔。詞向量同廉,維度一般較低,一般是50維或100維柑司,可避免維度災(zāi)難迫肖,更容易深度學(xué)習(xí)。
語言模型表達(dá)已知前n-1個(gè)詞前提下攒驰,預(yù)測(cè)第n個(gè)詞的概率蟆湖。詞向量訓(xùn)練,無監(jiān)督學(xué)習(xí)讼育,沒有標(biāo)注數(shù)據(jù)帐姻,給n篇文章,可訓(xùn)練出詞向量奶段。基于三層神經(jīng)網(wǎng)絡(luò)構(gòu)建n-gram語言模型剥纷。最下面w是詞痹籍,上面C(w)是詞向量,詞向量一層是神經(jīng)網(wǎng)絡(luò)輸入層(第一層)晦鞋,輸入層是一個(gè)(n-1)×m矩陣蹲缠,n-1是詞向量數(shù)目,m是詞向量維度悠垛。第二層(隱藏層)是普通神經(jīng)網(wǎng)絡(luò)线定,H為權(quán)重,tanh為激活函數(shù)确买。第三層(輸出層)有|V|個(gè)節(jié)點(diǎn)斤讥,|V|是詞表大小,輸出U為權(quán)重湾趾,softmax作激活函數(shù)實(shí)現(xiàn)歸一化芭商,最終輸出某個(gè)詞概率派草。增加一個(gè)從輸入層到輸出層直連邊(線性變換),可提升模型效果铛楣,變換矩陣設(shè)為W近迁。假設(shè)C(w)是輸入x,y計(jì)算公式是y = b + Wx + Utanh(d+Hx)簸州。模型訓(xùn)練變量C鉴竭、H、U岸浑、W搏存。梯度下降法訓(xùn)練得出C是生成詞向量所用矩陣,C(w)是所需詞向量助琐。
詞向量應(yīng)用祭埂。找同義詞。案例google word2vec工具兵钮,訓(xùn)練好詞向量蛆橡,指定一個(gè)詞,返回cos距離最相近詞并排序掘譬。詞性標(biāo)注和語義角色標(biāo)注任務(wù)泰演。詞向量作神經(jīng)網(wǎng)絡(luò)輸入層,通過前饋網(wǎng)絡(luò)和卷積網(wǎng)絡(luò)完成葱轩。句法分析和情感分析任務(wù)睦焕。詞向量作遞歸神經(jīng)網(wǎng)絡(luò)輸入。命名實(shí)體識(shí)別和短語識(shí)別靴拱。詞向量作擴(kuò)展特征使用垃喊。詞向量 C(king)-C(queue)≈C(man)-C(woman),減法是向量逐維相減袜炕,C(king)-C(man)+C(woman)最相近向量是C(queue)本谜,語義空間線性關(guān)系。
詞向量是深度學(xué)習(xí)應(yīng)用NLP根基偎窘,word2vec是使用最廣泛最簡(jiǎn)單有效詞向量訓(xùn)練工具乌助。
一個(gè)記憶單元識(shí)別一個(gè)事物,叫l(wèi)ocalist representation陌知。幾個(gè)記憶單元分別識(shí)別基礎(chǔ)信息他托,通過這幾個(gè)記憶單元輸出,表示所有事物仆葡,叫distributed representation赏参,詞向量。localist representation 稀疏表達(dá),one hot vector登刺,每一類型用向量一維來表示籽腕。distributed representation 分布式表達(dá),增加表達(dá)只需要增加一個(gè)或很少特征維度纸俭。
word embedding皇耗,詞嵌入,范疇論揍很,morphism(態(tài)射)郎楼,態(tài)射表示兩個(gè)數(shù)學(xué)結(jié)構(gòu)中保持結(jié)構(gòu)過程抽象,一個(gè)域和另一個(gè)域之間關(guān)系窒悔。范疇論中嵌入(態(tài)射)保持結(jié)構(gòu)呜袁,word embedding表示“降維”嵌入,通過降維避免維度災(zāi)難简珠,降低計(jì)算復(fù)雜度阶界,更易于深度學(xué)習(xí)應(yīng)用。
word2vec本質(zhì)聋庵,通過distributed representation表達(dá)方式表示詞膘融,通過降維word embedding減少計(jì)算量。
word2vec訓(xùn)練神經(jīng)概率語言模型祭玉。word2vec CBOW和Skip-gram模型氧映。CBOW模型。Continuous Bag-of-Words Model脱货,已知當(dāng)前詞上下文預(yù)測(cè)當(dāng)前詞岛都。CBOW模型神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),輸入層振峻,詞w上下文2c個(gè)詞的詞向量臼疫。投影層,輸入層2c個(gè)向量做求和累加扣孟。輸出層多矮,霍夫曼樹,葉子節(jié)點(diǎn)是語料出現(xiàn)過詞哈打,權(quán)重是出現(xiàn)次數(shù)。神經(jīng)網(wǎng)絡(luò)模型首尾相接改成求和累加讯壶,減少維度料仗。去掉隱藏層,減少計(jì)算量伏蚊。輸出層softmax歸一化運(yùn)算改成霍夫曼樹立轧。
基于霍夫曼樹Hierarchical Softmax技術(shù)。基于訓(xùn)練語料得到每一個(gè)可能w概率氛改≌饰霍夫曼樹,非根節(jié)點(diǎn)θ表示待訓(xùn)練參數(shù)向量胜卤,當(dāng)投射層產(chǎn)出新向量x疆导,邏輯回歸公式 σ(xTθ) = 1/(1+e^(-xTθ)),可得每一層被分到左節(jié)點(diǎn)(1)還是右節(jié)點(diǎn)(0)概率p(d|x,θ) = 1-σ(xTθ)和p(d|x,θ) = σ(xTθ)葛躏。以對(duì)數(shù)似然函數(shù)為優(yōu)化目標(biāo)澈段,假設(shè)兩個(gè)求和符號(hào)部分記作L(w, j),θ更新公式舰攒,x梯度公式败富,x多個(gè)v累加,word2vec中v更新方法摩窃。Skip-gram模型兽叮,Continuous Skip-gram Model,已知當(dāng)前詞情況預(yù)測(cè)上下文猾愿。Skip-gram模型神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)鹦聪。輸入層,w詞向量v(w)匪蟀。投影層椎麦,v(w)。輸出層材彪,霍夫曼樹观挎。θ和v(w)更新公式,符號(hào)名從x改v(w)段化。
word2vec嘁捷,下載源碼,https://github.com/warmheartli/ChatBotCourse/tree/master/word2vec)显熏,執(zhí)行make編譯(mac系統(tǒng)代碼所有#include <malloc.h>替換成#include <sys/malloc.h>)雄嚣。編譯生成word2vec、word2phrase喘蟆、word-analogy缓升、distance、compute-accuracy二進(jìn)制文件蕴轨。訓(xùn)練港谊,語料,已切好詞(空格分隔)文本橙弱。執(zhí)行 ./word2vec -train train.txt -output vectors.bin -cbow 0 -size 200 -window 5 -negative 0 -hs 1 -sample 1e-3 -thread 12 -binary 1 歧寺。生成vectors.bin文件燥狰,訓(xùn)練好詞向量二進(jìn)制文件,求近義詞了斜筐,執(zhí)行 ./distance vectors.bin 龙致。
參考資料:
《Python 自然語言處理》
http://www.shareditor.com/blogshow?blogId=92
http://www.shareditor.com/blogshow?blogId=97
http://www.shareditor.com/blogshow?blogId=99
http://www.shareditor.com/blogshow?blogId=100
歡迎推薦上海機(jī)器學(xué)習(xí)工作機(jī)會(huì),我的微信:qingxingfengzi