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

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

由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个概率值。

# 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)
# 初始化生成随机的权重(变量),避免神经元输出恒为0
def weight_variable(shape):
    # 以正态分布生成随机值
    initial = tf.truncated_normal(shape, stddev=0.1)
    return tf.Variable(initial)
# 初始化生成随机的偏置项(常量),避免神经元输出恒为0
def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)
# 卷积采用1步长,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个:0-9
y_ = tf.placeholder("float", [None,10])
# 第一层卷积权重,视野是5*5,输入通道1个,输出通道32个
W_conv1 = weight_variable([5, 5, 1, 32])
# 第一层卷积偏置项有32个
b_conv1 = bias_variable([32])
# 把x变成4d向量,第二维和第三维是图像尺寸,第四维是颜色通道数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)
# 第二层卷积权重,视野是5*5,输入通道32个,输出通道64个
W_conv2 = weight_variable([5, 5, 32, 64])
# 第二层卷积偏置项有64个
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个通道,输出是1024个神经元
W_fc1 = weight_variable([7 * 7 * 64, 1024])
# 第三层全连接偏置项有1024个
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优化器来做梯度最速下降
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}))

词向量。自然语言需要数学化才能被计算机认识计算。为每个词分配一个编号,不能表示词与词关系。每一个词对应一个向量,词义相近词,词向量距离越近(欧氏距离、夹角余弦)。词向量,维度一般较低,一般是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

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 zhuanlan_guanli@qq.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏真皮专栏

Some methods of deep learning and dimensionality reduction

上一篇主要是讲了全连接神经网络,这里主要讲的就是深度学习网络的一些设计以及一些权值的设置。神经网络可以根据模型的层数,模型的复杂度和神经元的多少大致可以分成两类...

561
来自专栏算法channel

logistics判别与线性模型中的4个问题

之前说过,机器学习的两大任务是回归和分类,上章的线性回归模型适合进行回归分析,例如预测房价,但是当输出的结果为离散值时,线性回归模型就不适用了。我们的任务是:将...

1000
来自专栏数据派THU

一文图解机器学习的基本算法!

来源:软件定义世界 本文长度为2877字,建议阅读6分钟 本文为你分析如何选择机器学习的各种方法。 每当提到机器学习,大家总是被其中的各种各样的算法和方法搞晕,...

1935
来自专栏人工智能LeadAI

TensorFlow从0到1丨 第六篇:解锁梯度下降算法

上一篇 5 TF轻松搞定线性回归,知道了模型参数训练的方向是由梯度下降算法指导的,并使用了TF的封装tf.train.GradientDescentOptimi...

2989
来自专栏AI科技大本营的专栏

机器学习笔试题精选

机器学习是一门理论性和实战性都比较强的技术学科。在应聘机器学习相关工作岗位时,我们常常会遇到各种各样的机器学习问题和知识点。为了帮助大家对这些知识点进行梳理和理...

693
来自专栏PaddlePaddle

【词向量】 噪声对比估计加速词向量训练

导语 PaddlePaddle提供了丰富的运算单元,帮助大家以模块化的方式构建起千变万化的深度学习模型来解决不同的应用问题。这里,我们针对常见的机器学习任务,提...

3317
来自专栏红色石头的机器学习之路

台湾大学林轩田机器学习技法课程学习笔记12 -- Neural Network

上节课我们主要介绍了Gradient Boosted Decision Tree。GBDT通过使用functional gradient的方法得到一棵一棵不同的...

2070
来自专栏算法channel

机器学习|Adaboost算法

01 — Boosting Boosting的基本思想是将若干个弱分类器(base learner)组合起来,变成一个强分类器,它需要回答2个问题: 如何改变训...

2627
来自专栏PPV课数据科学社区

收藏!机器学习与深度学习面试问题总结.....

后向传播是在求解损失函数L对参数w求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置0,否则所有隐...

772
来自专栏人工智能头条

机器学习笔试题精选

机器学习是一门理论性和实战性都比较强的技术学科。在应聘机器学习相关工作岗位时,我们常常会遇到各种各样的机器学习问题和知识点。为了帮助大家对这些知识点进行梳理和理...

681

扫描关注云+社区