分享

机器不学习【博客介绍】

本帖最后由 desehawk 于 2018-4-19 18:40 编辑

博客介绍:

专治机器不会学、瞎学、乱学等疑难杂症


地址:
https://zhuanlan.zhihu.com/zhaoyeyu


Batch Normalization原理与实战


前言
本期专栏主要来从理论与实战视角对深度学习中的Batch Normalization的思路进行讲解、归纳和总结,并辅以代码让小伙伴儿们对Batch Normalization的作用有更加直观的了解。
本文主要分为两大部分。第一部分是理论板块,主要从背景、算法、效果等角度对Batch Normalization进行详解;第二部分是实战板块,主要以MNIST数据集作为整个代码测试的数据,通过比较加入Batch Normalization前后网络的性能来让大家对Batch Normalization的作用与效果有更加直观的感知。

(一)理论板块
理论板块将从以下四个方面对Batch Normalization进行详解:
  • 提出背景
  • BN算法思想
  • 测试阶段如何使用BN
  • BN的优势
理论部分主要参考2015年Google的Sergey Ioffe与Christian Szegedy的论文内容,并辅以吴恩达Coursera课程与其它博主的资料。所有参考内容链接均见于文章最后参考链接部分。
1 提出背景1.1 炼丹的困扰
在深度学习中,由于问题的复杂性,我们往往会使用较深层数的网络进行训练,相信很多炼丹的朋友都对调参的困难有所体会,尤其是对深层神经网络的训练调参更是困难且复杂。在这个过程中,我们需要去尝试不同的学习率、初始化参数方法(例如Xavier初始化)等方式来帮助我们的模型加速收敛。深度神经网络之所以如此难训练,其中一个重要原因就是网络中层与层之间存在高度的关联性与耦合性。下图是一个多层的神经网络,层与层之间采用全连接的方式进行连接。

1.jpg


我们规定左侧为神经网络的底层,右侧为神经网络的上层。那么网络中层与层之间的关联性会导致如下的状况:随着训练的进行,网络中的参数也随着梯度下降在不停更新。一方面,当底层网络中参数发生微弱变化时,由于每一层中的线性变换与非线性激活映射,这些微弱变化随着网络层数的加深而被放大(类似蝴蝶效应);另一方面,参数的变化导致每一层的输入分布会发生改变,进而上层的网络需要不停地去适应这些分布变化,使得我们的模型训练变得困难。上述这一现象叫做Internal Covariate Shift。

更多参考https://zhuanlan.zhihu.com/p/34879333


本帖被以下淘专辑推荐:

已有(6)人评论

跳转到指定楼层
desehawk 发表于 2018-4-19 18:19:03
生成对抗网络(GAN)之MNIST数据生成



前言
GAN从2014年诞生以来发展的是相当火热,比较著名的GAN的应用有Pix2Pix、CycleGAN等。本篇文章主要是让初学者通过代码了解GAN的结构和运作机制,对理论细节不做过多介绍。我们还是采用MNIST手写数据集(不得不说这个数据集对于新手来说非常好用)来作为我们的训练数据,我们将构建一个简单的GAN来进行手写数字图像的生成。
认识GAN
GAN主要包括了两个部分,即生成器generator与判别器discriminator。生成器主要用来学习真实图像分布从而让自身生成的图像更加真实,以骗过判别器。判别器则需要对接收的图片进行真假判别。在整个过程中,生成器努力地让生成的图像更加真实,而判别器则努力地去识别出图像的真假,这个过程相当于一个二人博弈,随着时间的推移,生成器和判别器在不断地进行对抗,最终两个网络达到了一个动态均衡:生成器生成的图像接近于真实图像分布,而判别器识别不出真假图像,对于给定图像的预测为真的概率基本接近0.5(相当于随机猜测类别)。

1.jpg
对于GAN更加直观的理解可以用一个例子来说明:造假币的团伙相当于生成器,他们想通过伪造金钱来骗过银行,使得假币能够正常交易,而银行相当于判别器,需要判断进来的钱是真钱还是假币。因此假币团伙的目的是要造出银行识别不出的假币而骗过银行,银行则是要想办法准确地识别出假币。
因此,我们可以将上面的内容进行一个总结。给定真=1,假=0,那么有:
  • 对于给定的真实图片(real image),判别器要为其打上标签1;
  • 对于给定的生成图片(fake image),判别器要为其打上标签0;
  • 对于生成器传给辨别器的生成图片,生成器希望辨别器打上标签1。
有了上面的直观理解,下面就让我们来实现一个GAN来生成手写数据吧!还有一些细节会在代码部分进行介绍。
说明
建议将代码pull下来,有部分代码实现没有写在文章中。



回复

使用道具 举报

desehawk 发表于 2018-4-19 18:20:14
深度卷积GAN之图像生成


前言
在我们之前的文章中,我们学习了如何构造一个简单的GAN来生成MNIST手写图片。对于图像问题,卷积神经网络相比于简单地全连接的神经网络更具优势,因此,我们这一节我们将继续深入GAN,通过融合卷积神经网络来对我们的GAN进行改进,实现一个深度卷积GAN。如果还没有亲手实践过GAN的小伙伴可以先去学习一下上一篇专栏:生成对抗网络(GAN)之MNIST数据生成
专栏中的所有代码都在我的GitHub中,欢迎star与fork。
本次代码在NELSONZHAO/zhihu/dcgan,里面包含了两个文件:
  • dcgan_mnist:基于MNIST手写数据集构造深度卷积GAN模型
  • dcgan_cifar:基于CIFAR数据集构造深度卷积GAN模型
本文主要以MNIST为例进行介绍,两者在本质上没有差别,只在细微的参数上有所调整。由于穷学生资源有限,没有对模型增加迭代次数,也没有构造更深的模型。并且也没有选取像素很高的图像,高像素非常消耗计算量。本节只是一个抛砖引玉的作用,让大家了解DCGAN的结构,如果有资源的小伙伴可以自己去尝试其他更清晰的图片以及更深的结构,相信会取得很不错的结果。

工具
  • Python3
  • TensorFlow 1.0
  • Jupyter notebook
正文
整个正文部分将包括以下部分:
- 数据加载
- 模型输入  
- Generator  
- Discriminator
- Loss
- Optimizer
- 训练模型
- 可视化
更多参考https://zhuanlan.zhihu.com/p/28329335



回复

使用道具 举报

desehawk 发表于 2018-4-19 18:21:45
利用卷积自编码器对图片进行降噪

前言
这周工作太忙,本来想更把Attention tranlsation写出来,但一直抽不出时间,等后面有时间再来写。我们这周来看一个简单的自编码器实战代码,关于自编码器的理论介绍我就不详细介绍了,网上一搜一大把。最简单的自编码器就是通过一个encoder和decoder来对输入进行复现,例如我们将一个图片输入到一个网络中,自编码器的encoder对图片进行压缩,得到压缩后的信息,进而decoder再将这个信息进行解码从而复现原图。

1.jpg
作图工具:OmniGraffle
自编码器实际上是通过去最小化target和input的差别来进行优化,即让输出层尽可能地去复现原来的信息。由于自编码器的基础形式比较简单,对于它的一些变体也非常之多,包括DAE,SDAE,VAE等等,如果感兴趣的小伙伴可以去网上搜一下其他相关信息。
本篇文章将实现两个Demo,第一部分即实现一个简单的input-hidden-output结的自编码器,第二部分将在第一部分的基础上实现卷积自编码器来对图片进行降噪。
工具说明
  • TensorFlow1.0
  • jupyter notebook
  • 数据:MNIST手写数据集
  • 完整代码地址:NELSONZHAO/zhihu


更多参考
https://zhuanlan.zhihu.com/p/27902193


回复

使用道具 举报

desehawk 发表于 2018-4-19 18:25:21

从Encoder到Decoder实现Seq2Seq模型


前言
好久没有更新专栏,今天我们来看一个简单的Seq2Seq实现,我们将使用TensorFlow来实现一个基础版本的Seq2Seq,主要帮助理解Seq2Seq中的基础架构。
最基础的Seq2Seq模型包含了三个部分,即Encoder、Decoder以及连接两者的中间状态向量,Encoder通过学习输入,将其编码成一个固定大小的状态向量S,继而将S传给Decoder,Decoder再通过对状态向量S的学习来进行输出。

1.jpg
图中每一个box代表了一个RNN单元,通常是LSTM或者GRU。其实基础的Seq2Seq是有很多弊端的,首先Encoder将输入编码为固定大小状态向量的过程实际上是一个信息“信息有损压缩”的过程,如果信息量越大,那么这个转化向量的过程对信息的损失就越大,同时,随着sequence length的增加,意味着时间维度上的序列很长,RNN模型也会出现梯度弥散。最后,基础的模型连接Encoder和Decoder模块的组件仅仅是一个固定大小的状态向量,这使得Decoder无法直接去关注到输入信息的更多细节。由于基础Seq2Seq的种种缺陷,随后引入了Attention的概念以及Bi-directional encoder layer等,由于本篇文章主要是构建一个基础的Seq2Seq模型,对其他改进tricks先不做介绍。
总结起来说,基础的Seq2Seq主要包括Encoder,Decoder,以及连接两者的固定大小的State Vector。



更多参考
https://zhuanlan.zhihu.com/p/27608348


回复

使用道具 举报

desehawk 发表于 2018-4-19 18:26:29
本帖最后由 desehawk 于 2018-4-19 18:29 编辑

理解 Word2Vec 之 Skip-Gram 模型


写在之前
专栏终于申请成功啦,不过现在正在申请改名中,可能要审核几天。后面我会不定期在专栏中更新机器学习和深度学习的一些内容,主要包括机器学习的比赛代码、深度学习的算法思想以及深度学习的实战代码。由于目前我在公司实习中,所以平时上班时间就认真上班啦,下班以后和周末我会抽空去写这个专栏,对于评论区的问题我也会尽量一一回复的!

这次的分享主要是对Word2Vec模型的两篇英文文档的翻译、理解和整合,这两篇英文文档都是介绍Word2Vec中的Skip-Gram模型。下一篇专栏文章将会用TensorFlow实现基础版Word2Vec的skip-gram模型,所以本篇文章先做一个理论铺垫。

原文英文文档请参考链接:
- Word2Vec Tutorial - The Skip-Gram Model
- Word2Vec (Part 1): NLP With Deep Learning with Tensorflow (Skip-gram)


什么是Word2Vec和Embeddings?

Word2Vec是从大量文本语料中以无监督的方式学习语义知识的一种模型,它被大量地用在自然语言处理(NLP)中。那么它是如何帮助我们做自然语言处理呢?Word2Vec其实就是通过学习文本来用词向量的方式表征词的语义信息,即通过一个嵌入空间使得语义上相似的单词在该空间内距离很近。Embedding其实就是一个映射,将单词从原先所属的空间映射到新的多维空间中,也就是把原先词所在空间嵌入到一个新的空间中去。

我们从直观角度上来理解一下,cat这个单词和kitten属于语义上很相近的词,而dog和kitten则不是那么相近,iphone这个单词和kitten的语义就差的更远了。通过对词汇表中单词进行这种数值表示方式的学习(也就是将单词转换为词向量),能够让我们基于这样的数值进行向量化的操作从而得到一些有趣的结论。比如说,如果我们对词向量kitten、cat以及dog执行这样的操作:kitten - cat + dog,那么最终得到的嵌入向量(embedded vector)将与puppy这个词向量十分相近。
第一部分
模型
Word2Vec模型中,主要有Skip-Gram和CBOW两种模型,从直观上理解,Skip-Gram是给定input word来预测上下文。而CBOW是给定上下文,来预测input word。本篇文章仅讲解Skip-Gram模型。
1.jpg
Skip-Gram模型的基础形式非常简单,为了更清楚地解释模型,我们先从最一般的基础模型来看Word2Vec(下文中所有的Word2Vec都是指Skip-Gram模型)。
Word2Vec模型实际上分为了两个部分,第一部分为建立模型,第二部分是通过模型获取嵌入词向量。Word2Vec的整个建模过程实际上与自编码器(auto-encoder)的思想很相似,即先基于训练数据构建一个神经网络,当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵——后面我们将会看到这些权重在Word2Vec中实际上就是我们试图去学习的“word vectors”。基于训练数据建模的过程,我们给它一个名字叫“Fake Task”,意味着建模并不是我们最终的目的。


上面提到的这种方法实际上会在无监督特征学习(unsupervised feature learning)中见到,最常见的就是自编码器(auto-encoder):通过在隐层将输入进行编码压缩,继而在输出层将数据解码恢复初始状态,训练完成后,我们会将输出层“砍掉”,仅保留隐层。

更多参考
https://zhuanlan.zhihu.com/p/27234078
回复

使用道具 举报

desehawk 发表于 2018-4-19 18:31:53
《安娜卡列尼娜》文本生成——利用TensorFlow构建LSTM模型


前言
最近看完了LSTM的一些外文资料,主要参考了Colah的blog以及Andrej Karpathy blog的一些关于RNN和LSTM的材料,准备动手去实现一个LSTM模型。代码的基础框架来自于Udacity上深度学习纳米学位的课程(付费课程)的一个demo,我刚开始看代码的时候真的是一头雾水,很多东西没有理解,后来反复查阅资料,并我重新对代码进行了学习和修改,对步骤进行了进一步的剖析,下面将一步步用TensorFlow来构建LSTM模型进行文本学习并试图去生成新的文本。本篇文章比较适合新手去操作,LSTM层采用的是BasicLSTMCell。
关于RNN与LSTM模型本文不做介绍,详情去查阅资料过着去看上面的blog链接,讲的很清楚啦。这篇文章主要是偏向实战,来自己动手构建LSTM模型。
数据集来自于外文版《安娜卡列妮娜》书籍的文本文档(本文后面会提供整个project的git链接)。
工具介绍
  • 语言:Python 3
  • 包:TensorFlow及其它数据处理包(见代码中)
  • 编辑器:jupyter notebook
  • 线上GPU:floyd
----------------------------------------------------------------------------------------------------------
正文部分
正文部分主要包括以下四个部分:
- 数据预处理:加载数据、转换数据、分割数据mini-batch
- 模型构建:输入层,LSTM层,输出层,训练误差,loss,optimizer
- 模型训练:设置模型参数对模型进行训练
- 生成新文本:训练新的文本

主题:整个文本将基于《安娜卡列妮娜》这本书的英文文本作为LSTM模型的训练数据,输入为单个字符,通过学习整个英文文档的字符(包括字母和标点符号等)来进行文本生成。在开始建模之前,我们首先要明确我们的输入和输出。即输入是字符,输出是预测出的新字符。
一. 数据预处理
在开始模型之前,我们首先要导入需要的包:
import timeimport numpy as npimport tensorflow as tf
这一部分主要包括了数据的转换与mini-batch的分割步骤。
首先我们来进行数据的加载与编码转换。由于我们是基于字符(字母和标点符号等单个字符串,以下统称为字符)进行模型构建,也就是说我们的输入和输出都是字符。举个栗子,假如我们有一个单词“hello”,我们想要基于这个单词构建LSTM,那么希望的到的结果是,输入“h”,预测下一个字母为“e”;输入“e”时,预测下一个字母为“l”,等等。
因此我们的输入便是一个个字母,下面我们将文章进行转换。
1.jpg
上面的代码主要完成了下面三个任务:
- 得到了文章中所有的字符集合 vocab
- 得到一个字符-数字的映射 vocab_to_int
- 得到一个数字-字符的映射 int_to_vocab
- 对原文进行转码后的列表 encoded
完成了前面的数据预处理操作,接下来就是要划分我们的数据集,在这里我们使用mini-batch来进行模型训练,那么我们要如何划分数据集呢?在进行mini-batch划分之前,我们先来了解几个概念。

2.jpg 假如我们目前手里有一个序列1-12,我们接下来以这个序列为例来说明划分mini-batch中的几个概念。首先我们回顾一下,在DNN和CNN中,我们都会将数据分batch输入给神经网络,加入我们有100个样本,如果设置我们的batch_size=10,那么意味着每次我们都会向神经网络输入10个样本进行训练调整参数。同样的,在LSTM中,batch_size意味着每次向网络输入多少个样本,在上图中,当我们设置batch_size=2时,我们会将整个序列划分为6个batch,每个batch中有两个数字。
然而由于RNN中存在着“记忆”,也就是循环。事实上一个循环神经网络能够被看做是多个相同神经网络的叠加,在这个系统中,每一个网络都会传递信息给下一个。上面的图中,我们可以看到整个RNN网络由三个相同的神经网络单元叠加起来的序列。那么在这里就有了第二个概念sequence_length(也叫steps),中文叫序列长度。上图中序列长度是3,可以看到将三个字符作为了一个序列。
有了上面两个概念,我们来规范一下后面的定义。我们定义一个batch中的序列个数为N(即batch_size),定义单个序列长度为M(也就是我们的num_steps)。那么实际上我们每个batch是一个的数组,相当于我们的每个batch中有个字符。在上图中,当我们设置N=2, M=3时,我们可以得到每个batch的大小为2 x 3 = 6个字符,整个序列可以被分割成12 / 6 = 2个batch。
基于上面的分析,我们下面来进行mini-batch的分割:
3.jpg
上面的代码定义了一个generator,调用函数会返回一个generator对象,我们可以获取一个batch。
经过上面的步骤,我们已经完成了对数据集的预处理。下一步我们开始构建模型。


更多地址:
https://zhuanlan.zhihu.com/p/27087310

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条