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

由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-8import sys
import importlib
importlib.reload(sys)from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tfflags = 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

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

  1. 深度学习笔记:07神经网络之手写数字识别的经典实现

    神经网络之手写数字识别的经典实现 上一节完成了简单神经网络代码的实现,下面我们将进行最终的实现:输入一张手写图片后,网络输出该图片对应的数字.由于网络需要用0-9一共十个数字中挑选出一个,所以我们的网 ...

  2. TensorFlow 2.0 mnist手写数字识别(CNN卷积神经网络)

    TensorFlow 2.0 (五) - mnist手写数字识别(CNN卷积神经网络) 源代码/数据集已上传到 Github - tensorflow-tutorial-samples 大白话讲解卷积 ...

  3. pytorch手写数字识别验证四流网络

    四流网络验证 四流网络10 epoch 结果 16.19526395201683 correct1: tensor(9871, device='cuda:0') Test acc: 0.9871512 ...

  4. Python学习记录 搭建BP神经网络实现手写数字识别

    搭建BP神经网络实现手写数字识别 通过之前的文章我们知道了,构建一个简单的神经网络需要以下步骤 准备数据 初始化假设 输入神经网络进行计算 输出运行结果 这次,我们来通过sklearn的手写数字数据集 ...

  5. 深度学习面试题12:LeNet(手写数字识别)

    目录 神经网络的卷积.池化.拉伸 LeNet网络结构 LeNet在MNIST数据集上应用 参考资料 LeNet是卷积神经网络的祖师爷LeCun在1998年提出,用于解决手写数字识别的视觉任务.自那时起 ...

  6. 深度学习--TensorFlow(项目)Keras手写数字识别

    目录 效果展示 基础理论 1.softmax激活函数 2.神经网络 3.隐藏层及神经元最佳数量 一.数据准备 1.载入数据集 2.数据处理 2-1.归一化 2-2.独热编码 二.神经网络拟合 1.搭建 ...

  7. [Kaggle] Digit Recognizer 手写数字识别(卷积神经网络)

    文章目录 1. 使用 LeNet 预测 1.1 导入包 1.2 建立 LeNet 模型 1.3 读入数据 1.4 定义模型 1.5 训练 1.6 绘制训练曲线 1.7 预测提交 2. 使用 VGG16 ...

  8. 利用python卷积神经网络手写数字识别_卷积神经网络使用Python的手写数字识别

    为了使机器更智能,开发人员正在研究机器学习和深度学习技术.人类通过反复练习和重复执行任务来学习执行任务,从而记住了如何执行任务.然后,他大脑中的神经元会自动触发,它们可以快速执行所学的任务.深度学习与 ...

  9. 深度学习框架Caffe学习笔记(6)-测试自己的手写数字图片

    在之前的实验中我们使用过 $ ./build/tools/caffe.bin test \ -model examples/mnist/lenet_train_test.prototxt \ -wei ...

最新文章

  1. 一款机械陀螺仪-四旋翼上的机械陀螺仪
  2. java 上传超时_上传视频超时
  3. 互联网1分钟 |1112
  4. springboot2.5.0 整合 redis 配置详解
  5. Android Studio Xposed模块编写(二)
  6. linux ftp mysql_linux搭建ftp服务——未连接mysql数据库的做法
  7. PostMan 之 Mock 接口测试
  8. php数组排序语言,php数组排序函数有哪些
  9. jQuery中,$.extend,$obj.extend和$.fn.extend三者的区别
  10. “我是技术总监,你为毛总问我技术细节?”
  11. WebGrid 在asp.net mvc中的使用和理解(译)
  12. 闹钟android 代码,android 闹钟app源码(Alarm)
  13. dede密码修改 php,dede忘记后台密码修改程序
  14. C语言表达式语法分析——递归子程序法
  15. request.args.get()用法
  16. 一名职业3D建模师的学习经历,月薪28K依然焦虑
  17. python爬取上证股票的历史记录并画历史收盘图曲线
  18. 2.Select操作
  19. 新整理常见互联网公司职级和薪资一览!
  20. 电子元器件、专业术语和芯片封装的基础知识

热门文章

  1. 如何使用拦截器获取Controller方法名和注解信息?
  2. 还在写大量 if 来判断?试试用一个规则执行器来替代它
  3. 盘点 15 个好用的 API 接口管理神器
  4. 为什么 Java 中“1000==1000”为false,而”100==100“为true?
  5. 原来这才是 Kafka!(多图+深入)
  6. 面试:SpringBoot中的条件注解底层是如何实现的?
  7. 工作发狂:Mybatis 中$和#千万不要乱用!
  8. Dropout也能自动化?
  9. Keras vs PyTorch,哪一个更适合做深度学习?
  10. 干货 | 如何入手卷积神经网络