Forward-backward梯度求导(tensorflow word2vec实例)
- 考虑不可分的例子



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


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


- 梯度的下降法的梯度计算





- 关于线性和非线性的隐层

非线性隐层使得网络可以计算更加复杂的函数
线性隐层不能增强网络的表述能力,它们被用来做降维,减少训练需要的参数数目,这在nlp相关的模型中
经常用到(embedding vector)
- 一个back prop的例子


前向计算 Forward pass

后向计算 Backward pass
激活梯度

权重梯度


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

- 如果要计算从单元A到单元B的weight的梯度需要哪些信息?
参考上面的

需要 A的激活梯度 B的反向传播的梯度
另外一些需要了解的
- 许多梯度计算都是0,
这是因为我们采用了线性矫正来作为非线性单元 - 有一些梯度计算出来比其它的大很多,这回造成连乘后传递扩大,这是所谓的"梯度爆炸"
- 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实例)的更多相关文章
- NDArray自动求导
NDArray可以很方便的求解导数,比如下面的例子:(代码主要参考自https://zh.gluon.ai/chapter_crashcourse/autograd.html) 用代码实现如下: im ...
- Pytorch学习(一)—— 自动求导机制
现在对 CNN 有了一定的了解,同时在 GitHub 上找了几个 examples 来学习,对网络的搭建有了笼统地认识,但是发现有好多基础 pytorch 的知识需要补习,所以慢慢从官网 API进行学 ...
- Deep Learning基础--Softmax求导过程
一.softmax函数 softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类! 假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个 ...
- 『PyTorch x TensorFlow』第六弹_从最小二乘法看自动求导
TensoFlow自动求导机制 『TensorFlow』第二弹_线性拟合&神经网络拟合_恰是故人归 下面做了三个简单尝试, 利用包含gradients.assign等tf函数直接构建图进行自动 ...
- PytorchZerotoAll学习笔记(二)--梯度下降之手动求导
梯度下降算法: 待优化的损失值为 loss,那么我们希望预测的值能够很接近真实的值 y_pred ≍ y_label 我们的样本有n个,那么损失值可以由一下公式计算得出: 要使得los ...
- pytorch的自动求导机制 - 计算图的建立
一.计算图简介 在pytorch的官网上,可以看到一个简单的计算图示意图, 如下. import torchfrom torch.autograd import Variable x = Variab ...
- PyTorch官方中文文档:自动求导机制
自动求导机制 本说明将概述Autograd如何工作并记录操作.了解这些并不是绝对必要的,但我们建议您熟悉它,因为它将帮助您编写更高效,更简洁的程序,并可帮助您进行调试. 从后向中排除子图 每个变量都有 ...
- PytorchZerotoAll学习笔记(三)--自动求导
Pytorch给我们提供了自动求导的函数,不用再自己再推导计算梯度的公式了 虽然有了自动求导的函数,但是这里我想给大家浅析一下:深度学习中的一个很重要的反向传播 references:https:// ...
- 深度学习之卷积神经网络CNN及tensorflow代码实例
深度学习之卷积神经网络CNN及tensorflow代码实例 什么是卷积? 卷积的定义 从数学上讲,卷积就是一种运算,是我们学习高等数学之后,新接触的一种运算,因为涉及到积分.级数,所以看起来觉得很复杂 ...
随机推荐
- 如何同时运行两个tomcat?
两个以上,要更改端口号.1 下载tomcat的压缩包(不是安装的那种,直接解压缩就能用的)下载地址:http://tomcat.apache.org/download-55.cgi 下载好的文件名是: ...
- Java--笔记(6)
51.jsp的运行周期 jspt生命周期:init .service.destory 除了init只初始化一次外(第一次运行jsp的时候执行),其他 用户端运行JSP时方法都会运行一次. 52.二叉树 ...
- Pyhont-Urllib2
Urllib2 相当于的Urllib 的升级版 但又不能代替 Urllib 这个我得新手很费解呢...这个问题留着把,,等以后成大牛的时候在回来想想这儿问题!! Urllib2 常用 // 1 设置 ...
- JS写小游戏(一):游戏框架
前言 前一阵发现一个不错的网站,都是一些用html5+css+js写的小游戏,于是打算学习一番,写下这个系列博客主要是为了加深理解,当然也有一些个人感悟,如果英文好可以直接Click Here. 概述 ...
- 认识和使用NSOperation
原文链接:http://www.jianshu.com/p/2de9c776f226 NSOperation是OC中多线程技术的一种,是对GCD的OC包装.它包含队列(NSOperationQueue ...
- json使用
json是存储和交换文本信息的语法,类似 XML,比 XML 更小.更快,更易解析 json 可通过 JavaScript 进行解析 json 数据可使用 AJAX 进行传输 //读取var JSON ...
- 新手理解HTML、CSS、javascript之间的关系
http://www.cnblogs.com/dreamingbaobei/p/5062901.html 工作多年,一直忙忙碌碌的应用各种技术,现在不忙了,问问自己究竟在做什么,究竟会什么竟答不上来, ...
- Java Web编程技术学习要点及方向
学习编程技术要点及方向亮点: 传统学习编程技术落后,应跟著潮流,要对业务聚焦处理.要Jar, 不要War:以小为主,以简为宝,集堆而成.去繁取简 Spring Boot,明日之春(future of ...
- ecshop后台权限审核列表
1.权限语言包 languages\zh_cn\admin\priv_action.php //微仓 $_LANG['depot'] = '微仓管理'; $_LANG['depot_list_is_c ...
- CSS 实现背景透明 内容文字不透明 显示
思路主要是 IE9+ 谷歌 火狐等使用rgba(0,0,0,0.5)来确定透明度 前三个值是RGB值 可以直接参考PS里对应的值 最后一个是透明度 例子 background:rgba(255,255 ...