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

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
简介:

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

由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 替换成#include )。编译生成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

目录
相关文章
|
29天前
|
Ubuntu 网络安全 图形学
Ubuntu学习笔记(二):ubuntu20.04解决右上角网络图标激活失败或者消失,无法连接有线问题。
在Ubuntu 20.04系统中解决网络图标消失和无法连接有线网络问题的方法,其中第三种方法通过检查并确保Windows防火墙中相关服务开启后成功恢复了网络连接。
334 0
Ubuntu学习笔记(二):ubuntu20.04解决右上角网络图标激活失败或者消失,无法连接有线问题。
|
28天前
|
机器学习/深度学习 数据可视化 Linux
Seaborn可视化学习笔记(一):可视化神经网络权重分布情况
这篇文章是关于如何使用Seaborn库来可视化神经网络权重分布的教程,包括函数信息、测试代码和实际应用示例。
34 0
|
1月前
|
机器学习/深度学习 存储 自然语言处理
深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)
深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)
|
3月前
|
机器学习/深度学习 人工智能 编解码
【神经网络】基于对抗神经网络的图像生成是如何实现的?
对抗神经网络,尤其是生成对抗网络(GAN),在图像生成领域扮演着重要角色。它们通过一个有趣的概念——对抗训练——来实现图像的生成。以下将深入探讨GAN是如何实现基于对抗神经网络的图像生成的
36 3
WK
|
2月前
|
机器学习/深度学习 自然语言处理 算法
PSO算法和人工神经网络有什么不同
PSO算法(粒子群优化)与人工神经网络(ANN)在原理、应用及优化方式上差异显著。PSO模拟鸟群行为,通过粒子协作在解空间中搜索最优解;而ANN模仿大脑神经元结构,通过训练学习输入输出映射,适用于模式识别、图像处理等领域。PSO主要用于优化问题,实时性高,结果直观;ANN则在处理复杂非线性关系方面更强大,但结构复杂,训练耗时长,结果解释性较差。实际应用中需根据需求选择合适技术。
WK
24 0
|
3月前
|
机器学习/深度学习 算法 文件存储
【博士每天一篇文献-算法】 PNN网络启发的神经网络结构搜索算法Progressive neural architecture search
本文提出了一种名为渐进式神经架构搜索(Progressive Neural Architecture Search, PNAS)的方法,它使用顺序模型优化策略和替代模型来逐步搜索并优化卷积神经网络结构,从而提高了搜索效率并减少了训练成本。
53 9
|
3月前
|
机器学习/深度学习 网络安全 TensorFlow
探索操作系统的心脏:内核与用户空间的奥秘云计算与网络安全:技术挑战与未来趋势深度学习中的卷积神经网络(CNN)及其在图像识别中的应用
【8月更文挑战第29天】在数字世界的每一次点击与滑动背后,都隐藏着一个不为人知的故事。这个故事关于操作系统——计算机的灵魂,它如何协调硬件与软件,管理资源,并确保一切运行得井井有条。本文将带你走进操作系统的核心,揭示内核与用户空间的秘密,展现它们如何共同编织出我们日常数字生活的底层结构。通过深入浅出的讲解和代码示例,我们将一同解锁操作系统的神秘面纱,理解其对现代计算的重要性。 【8月更文挑战第29天】本文将深入探讨卷积神经网络(CNN)的基本原理和结构,以及它们如何被广泛应用于图像识别任务中。我们将通过代码示例来展示如何使用Python和TensorFlow库构建一个简单的CNN模型,并训练
|
3月前
|
机器学习/深度学习 自然语言处理 并行计算
【深度学习+面经】Transformer 网络学习笔记
Transformer模型的核心概念、优缺点以及在多个领域的应用,并提供了针对Transformer架构的面试问题及答案。
146 2
|
5月前
|
机器学习/深度学习 PyTorch 算法框架/工具
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
【从零开始学习深度学习】28.卷积神经网络之NiN模型介绍及其Pytorch实现【含完整代码】
|
3月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch代码实现神经网络
这段代码示例展示了如何在PyTorch中构建一个基础的卷积神经网络(CNN)。该网络包括两个卷积层,分别用于提取图像特征,每个卷积层后跟一个池化层以降低空间维度;之后是三个全连接层,用于分类输出。此结构适用于图像识别任务,并可根据具体应用调整参数与层数。
下一篇
无影云桌面