1. 考虑不可分的例子

 
 

 
 

  1. 通过使用basis functions 使得不可分的线性模型变成可分的非线性模型

  1. 最常用的就是写出一个目标函数
    并且使用梯度下降法
    来计算

 
 

  1. 梯度的下降法的梯度计算

 
 

 
 

 
 

 
 

  1. 关于线性和非线性的隐层

非线性隐层使得网络可以计算更加复杂的函数

线性隐层不能增强网络的表述能力,它们被用来做降维,减少训练需要的参数数目,这在nlp相关的模型中

经常用到(embedding vector)

 
 

  1. 一个back prop的例子

 
 

 
 

前向计算 Forward pass

后向计算 Backward pass

激活梯度

权重梯度

 
 

来看一下计算某些变量的梯度,需要计算哪些其它变量

  • 如果要计算从单元A到单元B的weight的梯度需要哪些信息?

    参考上面的

    需要 A的激活梯度 B的反向传播的梯度

另外一些需要了解的

  • 许多梯度计算都是0,
    这是因为我们采用了线性矫正来作为非线性单元
  • 有一些梯度计算出来比其它的大很多,这回造成连乘后传递扩大,这是所谓的"梯度爆炸"

 
 

 
 

  1. forward-backward的实例(word2vec)

考虑tensorflow实现的word2vec,tensorflow是可以自动求导的,但是你也可以自己来写这一部分

Word2vec_optimized.py就是自己实现的forward-backward步骤(手写),采用true sgd

看一下代码

# Training nodes.

inc = global_step.assign_add(1)

with tf.control_dependencies([inc]):

train = word2vec.neg_train(

w_in, #上图中左面的w,将在negtrain中被改变

w_out, #上图中右面的w,将在negtrain中被改变

examples, # 中心词编号数组,长度为batch_size

labels, # 周围词 surronding word 编号数组

lr, #学习率 learning rate

vocab_count=opts.vocab_counts.tolist(), #每个词的频次数组

num_negative_samples=opts.num_samples #负样本采样数目

)

 
 

 
 

REGISTER_OP("NegTrain")

.Input("w_in: Ref(float)") //Ref传递引用

.Input("w_out: Ref(float)")

.Input("examples: int32")

.Input("labels: int32")

.Input("lr: float")

.Attr("vocab_count: list(int)")

.Attr("num_negative_samples: int")

.Doc(R"doc(

Training via negative sampling.

 
 

w_in: input word embedding.

w_out: output word embedding.

examples: A vector of word ids.

labels: A vector of word ids.

vocab_count: Count of words in the vocabulary.

num_negative_samples: Number of negative samples per exaple.

)doc");

 
 

// Gradient accumulator for v_in.

Tensor
buf(DT_FLOAT, TensorShape({dims}));

auto
Tbuf = buf.flat<float>();

 
 

// Scalar buffer to hold sigmoid(+/- dot).

Tensor
g_buf(DT_FLOAT, TensorShape({}));

auto
g = g_buf.scalar<float>();

 
 

// The following loop needs 2 random 32-bit values per negative

// sample. We reserve 8 values per sample just in case the

// underlying implementation changes.

auto
rnd = base_.ReserveSamples32(batch_size * num_samples_ * 8);

random::SimplePhilox
srnd(&rnd);

 
 

for (int64
i = 0; i < batch_size; ++i) {

const
int32
example = Texamples(i);

DCHECK(0 <= example && example < vocab_size) << example;

const
int32
label = Tlabels(i);

DCHECK(0 <= label && label < vocab_size) << label;

auto
v_in = Tw_in.chip<0>(example);

 
 

//正样本label 1,
负样本label -1,累积误差
这里应该是按照MLE 最大化可能概率
所以是累加梯度,参考ng课件

nce的做法,转化为二分类问题

 
 

// Positive: example predicts label.

// forward: x = v_in' * v_out

// l = log(sigmoid(x))

// backward: dl/dx = g = sigmoid(-x)

// dl/d(v_in) = (dl/dx)*(dx/d(v_in)) = g * v_out'

// dl/d(v_out) = (dl/dx)*(dx/d(v_out)) = v_in' * g

{

auto
v_out = Tw_out.chip<0>(label);

auto
dot = (v_in * v_out).sum();

g = (dot.exp() + 1.f).inverse();

Tbuf = v_out * (g() * lr);

v_out += v_in * (g() * lr);

}

 
 

// Negative samples:

// forward: x = v_in' * v_sample

// l = log(sigmoid(-x))

// backward: dl/dx = g = -sigmoid(x)

// dl/d(v_in) = g * v_out'

// dl/d(v_out) = v_in' * g

for (int
j = 0; j < num_samples_; ++j) {

const
int
sample = sampler_->Sample(&srnd);

if (sample == label) continue; // Skip.

auto
v_sample = Tw_out.chip<0>(sample);

auto
dot = (v_in * v_sample).sum();

g = -((-dot).exp() + 1.f).inverse();

Tbuf += v_sample * (g() * lr);

v_sample += v_in * (g() * lr);

}

 
 

// Applies the gradient on v_in.

v_in += Tbuf;

}

 
 

 
 

Forward-backward梯度求导(tensorflow word2vec实例)的更多相关文章

  1. NDArray自动求导

    NDArray可以很方便的求解导数,比如下面的例子:(代码主要参考自https://zh.gluon.ai/chapter_crashcourse/autograd.html) 用代码实现如下: im ...

  2. Pytorch学习(一)—— 自动求导机制

    现在对 CNN 有了一定的了解,同时在 GitHub 上找了几个 examples 来学习,对网络的搭建有了笼统地认识,但是发现有好多基础 pytorch 的知识需要补习,所以慢慢从官网 API进行学 ...

  3. Deep Learning基础--Softmax求导过程

    一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...

  4. 『PyTorch x TensorFlow』第六弹_从最小二乘法看自动求导

    TensoFlow自动求导机制 『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归 下面做了三个简单尝试, 利用包含gradients.assign等tf函数直接构建图进行自动 ...

  5. PytorchZerotoAll学习笔记(二)--梯度下降之手动求导

    梯度下降算法:    待优化的损失值为 loss,那么我们希望预测的值能够很接近真实的值 y_pred ≍ y_label      我们的样本有n个,那么损失值可以由一下公式计算得出: 要使得los ...

  6. pytorch的自动求导机制 - 计算图的建立

    一.计算图简介 在pytorch的官网上,可以看到一个简单的计算图示意图, 如下. import torchfrom torch.autograd import Variable x = Variab ...

  7. PyTorch官方中文文档:自动求导机制

    自动求导机制 本说明将概述Autograd如何工作并记录操作.了解这些并不是绝对必要的,但我们建议您熟悉它,因为它将帮助您编写更高效,更简洁的程序,并可帮助您进行调试. 从后向中排除子图 每个变量都有 ...

  8. PytorchZerotoAll学习笔记(三)--自动求导

    Pytorch给我们提供了自动求导的函数,不用再自己再推导计算梯度的公式了 虽然有了自动求导的函数,但是这里我想给大家浅析一下:深度学习中的一个很重要的反向传播 references:https:// ...

  9. 深度学习之卷积神经网络CNN及tensorflow代码实例

    深度学习之卷积神经网络CNN及tensorflow代码实例 什么是卷积? 卷积的定义 从数学上讲,卷积就是一种运算,是我们学习高等数学之后,新接触的一种运算,因为涉及到积分.级数,所以看起来觉得很复杂 ...

随机推荐

  1. 看jpg和png图片

    emacs 24.4 下载http://pan.baidu.com/s/1mgIEPHe里的: zlib1.dll, libpng16-16.dll(png)和libjpeg-9.dll到emacs里 ...

  2. get last dirname/filename in a file path argument

    $ dirname /home/train/00.incipient_data/data_for_gene_prediction_and_RNA-seq/240_rep2.fastq /home/tr ...

  3. _UICreateCGImageFromIOSurface 使用API

    上传的时候,苹果发送邮件 Non-public API usage: The app references non-public symbols in DUO-LINK 4: _UICreateCGI ...

  4. EL表达式怎么获取Map的动态key?

    缘由 El表达式在调用Map的时候,后台传过来的Map的key不一定是一个固定的值,需要根据另外一个对象的id作为key来put,或者更加复杂的组合id+"string"作为一个k ...

  5. a版本冲刺第一天

    队名:Aruba   队员: 黄辉昌 李陈辉 林炳锋 鄢继仁 张秀锋 章  鼎 学号 昨天完成的任务 今天做的任务 明天要做的任务 困难点 体会 408 学习测试文档的编写 继续学习并借鉴,开始着手写 ...

  6. 【团队项目选题】自选项目:桌游APP

    由于我们团队的黄金点游戏结果是第二名,按理说是一定能选到一个自选项目的,所以以下只列出我们选择的自选项目 自选项目名称 桌游APP   暂定 (名字还没想好) 项目大致介绍 此APP集成了多种桌游,主 ...

  7. MyEclipse导入jquery-1.8.0.min.js等文件报错的解决方案

    1.选中报错的jquery文件例如"jquery-1.8.0.min.js". 2.右键选择 MyEclipse-->Exclude From Validation . 3. ...

  8. Python * 和 ** 参数问题

    Problem def calcuate(*keys) def calcluate(**keys) Slove *: 用来传递人一个无名字的参数,这些参数会以一个Tuple的形式来访问. **: 用来 ...

  9. C#------判断btye[]是否为空

    public byte[] PhotoByte; //= new byte[byte.MaxValue]; if(PhotoByte == null) { MessageBox.Show(" ...

  10. .Net 中的反射(动态创建类型实例) - Part.4

    动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它.可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以 ...