前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

原创
作者头像
利炳根
发布2018-03-13 03:03:59
7410
发布2018-03-13 03:03:59
举报
文章被收录于专栏:利炳根的专栏利炳根的专栏

人工神经网络,借鉴生物神经网络工作原理数学模型。

由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息。信息检索领域,模型训练合理排序模型,输入特征,文档质量、文档点击历史、文档前链数目、文档锚文本信息,为找特征隐藏信息,隐藏层神经元数目设置少于输入特征数目,经大量样本训练能还原原始特征模型,相当用少于输入特征数目信息还原全部特征,压缩,可发现某些特征之间存在隐含相关性,或者有某种特殊关系。让隐藏层神经元数目多余输入特征数目,训练模型可展示特征之间某种细节关联。输出输入一致,自编码算法。

人工神经网络模型,多层神经元结构建立,每一层抽象一种思维过程,经多层思考,得出结论。神经网络每一层有每一层专做事情,每一层神经元添加特殊约束条件。多层提取特定特征做机器学习是深度学习。

卷积,在一定范围内做平移并求平均值。卷积积分公式,对τ积分,对固定x,找x附近所有变量,求两个函数乘积,并求和。神经网络里面,每个神经元计算输出卷积公式,神经网络每一层输出一种更高级特征。自然语言,较近上下文词语之间存在一定相关性,标点、特殊词等分隔使、传统自然语言处理脱离词与词之间关联,丢失部分重要信息,利用卷积神经网络可以做多元(n-gram)计算,不损失自然语言临近词相关性信息。

自动问答系统深度学习应用RNN,利用时序建模。

卷积神经网络(Convolutional Neural Network,CNN),二维离散卷积运算和人工神经网络结合深度神经网络。自动提取特征。

手写数字识别。http://yann.lecun.com/exdb/mnist/手写数据集,文件是二进制像素单位保存几万张图片文件,https://github.com/warmheartli/ChatBotCourse。

多层卷积网络,第一层一个卷积和一个max pooling,卷积运算“视野”5×5像素范围,卷积使用1步长、0边距模板(保证输入输出同一个大小),1个输入通道(图片灰度,单色),32个输出通道(32个特征)。每张图片28×28像素,第一次卷积输出28×28大小。max pooling采用2×2大小模板,池化后输出尺寸14×14,一共有32个通道,一张图片输出是14×14×32=6272像素。第二层一个卷积和一个max pooling,输入通道32个(对应第一层32个特征),输出通道64个(输出64个特征),输入每张大小14×14,卷积层输出14×14,经过max pooling,输出大小7×7,输出像素7×7×64=3136。第三层一个密集连接层,一个有1024个神经元全连接层,第二层输出7×7×64个值作1024个神经元输入。神经元激活函数为ReLu函数,平滑版Softplus g(x)=log(1+e^x))。最终输出层,第三层1024个输出为输入,设计一个softmax层,输出10个概率值。

代码语言:txt
复制
# coding:utf-8
代码语言:txt
复制
import sys
代码语言:txt
复制
import importlib
代码语言:txt
复制
importlib.reload(sys)
代码语言:txt
复制
from tensorflow.examples.tutorials.mnist import input_data
代码语言:txt
复制
import tensorflow as tf
代码语言:txt
复制
flags = tf.app.flags
代码语言:txt
复制
FLAGS = flags.FLAGS
代码语言:txt
复制
flags.DEFINE_string('data_dir', './', 'Directory for storing data')
代码语言:txt
复制
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)
代码语言:txt
复制
# 初始化生成随机的权重(变量),避免神经元输出恒为0
代码语言:txt
复制
def weight_variable(shape):
代码语言:txt
复制
    # 以正态分布生成随机值
代码语言:txt
复制
    initial = tf.truncated_normal(shape, stddev=0.1)
代码语言:txt
复制
    return tf.Variable(initial)
代码语言:txt
复制
# 初始化生成随机的偏置项(常量),避免神经元输出恒为0
代码语言:txt
复制
def bias_variable(shape):
代码语言:txt
复制
    initial = tf.constant(0.1, shape=shape)
代码语言:txt
复制
    return tf.Variable(initial)
代码语言:txt
复制
# 卷积采用1步长,0边距,保证输入输出大小相同
代码语言:txt
复制
def conv2d(x, W):
代码语言:txt
复制
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
代码语言:txt
复制
# 池化采用2×2模板
代码语言:txt
复制
def max_pool_2x2(x):
代码语言:txt
复制
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
代码语言:txt
复制
        strides=[1, 2, 2, 1], padding='SAME')
代码语言:txt
复制
# 28*28=784
代码语言:txt
复制
x = tf.placeholder(tf.float32, [None, 784])
代码语言:txt
复制
# 输出类别共10个:0-9
代码语言:txt
复制
y_ = tf.placeholder("float", [None,10])
代码语言:txt
复制
# 第一层卷积权重,视野是5*5,输入通道1个,输出通道32个
代码语言:txt
复制
W_conv1 = weight_variable([5, 5, 1, 32])
代码语言:txt
复制
# 第一层卷积偏置项有32个
代码语言:txt
复制
b_conv1 = bias_variable([32])
代码语言:txt
复制
# 把x变成4d向量,第二维和第三维是图像尺寸,第四维是颜色通道数1
代码语言:txt
复制
x_image = tf.reshape(x, [-1,28,28,1])
代码语言:txt
复制
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
代码语言:txt
复制
h_pool1 = max_pool_2x2(h_conv1)
代码语言:txt
复制
# 第二层卷积权重,视野是5*5,输入通道32个,输出通道64个
代码语言:txt
复制
W_conv2 = weight_variable([5, 5, 32, 64])
代码语言:txt
复制
# 第二层卷积偏置项有64个
代码语言:txt
复制
b_conv2 = bias_variable([64])
代码语言:txt
复制
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
代码语言:txt
复制
h_pool2 = max_pool_2x2(h_conv2)
代码语言:txt
复制
# 第二层池化后尺寸编程7*7,第三层是全连接,输入是64个通道,输出是1024个神经元
代码语言:txt
复制
W_fc1 = weight_variable([7 * 7 * 64, 1024])
代码语言:txt
复制
# 第三层全连接偏置项有1024个
代码语言:txt
复制
b_fc1 = bias_variable([1024])
代码语言:txt
复制
h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
代码语言:txt
复制
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
代码语言:txt
复制
# 按float做dropout,以减少过拟合
代码语言:txt
复制
keep_prob = tf.placeholder("float")
代码语言:txt
复制
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
代码语言:txt
复制
# 最后的softmax层生成10种分类
代码语言:txt
复制
W_fc2 = weight_variable([1024, 10])
代码语言:txt
复制
b_fc2 = bias_variable([10])
代码语言:txt
复制
y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
代码语言:txt
复制
cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
代码语言:txt
复制
# Adam优化器来做梯度最速下降
代码语言:txt
复制
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
代码语言:txt
复制
correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
代码语言:txt
复制
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
代码语言:txt
复制
sess = tf.InteractiveSession()
代码语言:txt
复制
sess.run(tf.global_variables_initializer())
代码语言:txt
复制
for i in range(20000):
代码语言:txt
复制
    batch = mnist.train.next_batch(50)
代码语言:txt
复制
    if i%100 == 0:
代码语言:txt
复制
        train_accuracy = accuracy.eval(feed_dict={
代码语言:txt
复制
            x:batch[0], y_: batch[1], keep_prob: 1.0})
代码语言:txt
复制
        print("step %d, training accuracy %g"%(i, train_accuracy))
代码语言:txt
复制
    train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
代码语言:txt
复制
print("test accuracy %g"%accuracy.eval(feed_dict={
代码语言:txt
复制
    x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

词向量。自然语言需要数学化才能被计算机认识计算。为每个词分配一个编号,不能表示词与词关系。每一个词对应一个向量,词义相近词,词向量距离越近(欧氏距离、夹角余弦)。词向量,维度一般较低,一般是50维或100维,可避免维度灾难,更容易深度学习。

语言模型表达已知前n-1个词前提下,预测第n个词的概率。词向量训练,无监督学习,没有标注数据,给n篇文章,可训练出词向量。基于三层神经网络构建n-gram语言模型。最下面w是词,上面C(w)是词向量,词向量一层是神经网络输入层(第一层),输入层是一个(n-1)×m矩阵,n-1是词向量数目,m是词向量维度。第二层(隐藏层)是普通神经网络,H为权重,tanh为激活函数。第三层(输出层)有|V|个节点,|V|是词表大小,输出U为权重,softmax作激活函数实现归一化,最终输出某个词概率。增加一个从输入层到输出层直连边(线性变换),可提升模型效果,变换矩阵设为W。假设C(w)是输入x,y计算公式是y = b + Wx + Utanh(d+Hx)。模型训练变量C、H、U、W。梯度下降法训练得出C是生成词向量所用矩阵,C(w)是所需词向量。

词向量应用。找同义词。案例google word2vec工具,训练好词向量,指定一个词,返回cos距离最相近词并排序。词性标注和语义角色标注任务。词向量作神经网络输入层,通过前馈网络和卷积网络完成。句法分析和情感分析任务。词向量作递归神经网络输入。命名实体识别和短语识别。词向量作扩展特征使用。词向量 C(king)-C(queue)≈C(man)-C(woman),减法是向量逐维相减,C(king)-C(man)+C(woman)最相近向量是C(queue),语义空间线性关系。

词向量是深度学习应用NLP根基,word2vec是使用最广泛最简单有效词向量训练工具。

一个记忆单元识别一个事物,叫localist representation。几个记忆单元分别识别基础信息,通过这几个记忆单元输出,表示所有事物,叫distributed representation,词向量。localist representation 稀疏表达,one hot vector,每一类型用向量一维来表示。distributed representation 分布式表达,增加表达只需要增加一个或很少特征维度。

word embedding,词嵌入,范畴论,morphism(态射),态射表示两个数学结构中保持结构过程抽象,一个域和另一个域之间关系。范畴论中嵌入(态射)保持结构,word embedding表示“降维”嵌入,通过降维避免维度灾难,降低计算复杂度,更易于深度学习应用。

word2vec本质,通过distributed representation表达方式表示词,通过降维word embedding减少计算量。

word2vec训练神经概率语言模型。word2vec CBOW和Skip-gram模型。CBOW模型。Continuous Bag-of-Words Model,已知当前词上下文预测当前词。CBOW模型神经网络结构,输入层,词w上下文2c个词的词向量。投影层,输入层2c个向量做求和累加。输出层,霍夫曼树,叶子节点是语料出现过词,权重是出现次数。神经网络模型首尾相接改成求和累加,减少维度。去掉隐藏层,减少计算量。输出层softmax归一化运算改成霍夫曼树。

基于霍夫曼树Hierarchical Softmax技术。基于训练语料得到每一个可能w概率。霍夫曼树,非根节点θ表示待训练参数向量,当投射层产出新向量x,逻辑回归公式 σ(xTθ) = 1/(1+e^(-xTθ)),可得每一层被分到左节点(1)还是右节点(0)概率p(d|x,θ) = 1-σ(xTθ)和p(d|x,θ) = σ(xTθ)。以对数似然函数为优化目标,假设两个求和符号部分记作L(w, j),θ更新公式,x梯度公式,x多个v累加,word2vec中v更新方法。Skip-gram模型,Continuous Skip-gram Model,已知当前词情况预测上下文。Skip-gram模型神经网络结构。输入层,w词向量v(w)。投影层,v(w)。输出层,霍夫曼树。θ和v(w)更新公式,符号名从x改v(w)。

word2vec,下载源码,https://github.com/warmheartli/ChatBotCourse/tree/master/word2vec),执行make编译(mac系统代码所有#include <malloc.h>替换成#include <sys/malloc.h>)。编译生成word2vec、word2phrase、word-analogy、distance、compute-accuracy二进制文件。训练,语料,已切好词(空格分隔)文本。执行 ./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文件,训练好词向量二进制文件,求近义词了,执行 ./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

欢迎推荐上海机器学习工作机会,我的微信:qingxingfengzi

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NLP 服务
NLP 服务(Natural Language Process,NLP)深度整合了腾讯内部的 NLP 技术,提供多项智能文本处理和文本生成能力,包括词法分析、相似词召回、词相似度、句子相似度、文本润色、句子纠错、文本补全、句子生成等。满足各行业的文本智能需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档