机器之心上周介绍了一篇论文,说是不用BP也能训练神经网络,论文叫做《The HSIC Bottleneck: Deep Learning without Back-Propagation》,HSIC Bottleneck: Deep Learning without Back-Propagation](https://arxiv.org/pdf/1908.01580v1.pdf)》,引用了一个HSIC度量,并用其实现了直接从利用输入输出来优化隐藏层的参数。
下面主要讲的我自己对文章的理解,但是不一定对。

HSIC度量

我们一般使用互信息度量两个分布的依赖强弱,但是一般只有在知道两个分布的情况下才能得到。论文直接引用了HSIC度量使用抽样来测量两个分布依赖的强弱。

核函数根据经验使用高斯核函数

用keras实现:

def kernel_matrix(x, sigma):ndim = K.ndim(x)x1 = K.expand_dims(x, 0)x2 = K.expand_dims(x, 1)axis = tuple(range(2, ndim+1))return K.exp(-0.5*K.sum(K.pow(x1-x2, 2), axis=axis) / sigma ** 2)def hsic(Kx, Ky, m):Kxy = K.dot(Kx, Ky)h = tf.linalg.trace(Kxy) / m ** 2 + K.mean(Kx) * K.mean(Ky) - \2 * K.mean(Kxy) / mreturn h * (m / (m-1))**2

如何跨层直接优化隐藏层

一个好的隐藏层,它的输出应该尽量跟输出的依赖强和输入的依赖弱。换句话说,就是隐藏层输出应该尽量保存和输出相关的信息,移除和跟输出无关的信息(所有信息都来自输入)。
用文中的公式表示就是:

这里λ\lambdaλ经验值取100.。
我们直接优化(4)就可以做到跨层优化网络了。

HSIC-Bottleneck Trained

我们把所有隐藏层的放在一起优化,就得到了HSIC-Bottleneck Trained,
公式为:

keras代码实现:

class HSICBottleneckTrained(object):def __init__(self, model, batch_size, lambda_0, sigma):self.batch_size = batch_sizeinput_x = model._feed_inputs[0]input_y = model._feed_targets[0]Kx = kernel_matrix(input_x, sigma)Ky = kernel_matrix(input_y, sigma)param2grad = {}trainable_params = []total_loss = 0.for layer in model.layers:if layer.name.startswith("hsic"):params = layer.trainable_weightsif not params:continuehidden_z = layer.outputKz = kernel_matrix(hidden_z, sigma)loss = hsic(Kz, Kx, batch_size) - lambda_0 * hsic(Kz, Ky, batch_size)total_loss += losstrainable_params.extend(params)grads = K.gradients(loss, params)for p, g in zip(params, grads):param2grad[p.name] = gelse:layer.trainable = Falsemodel._collected_trainable_weights = trainable_paramsmodel.total_loss = total_lossoptim = model.optimizerdef get_gradients(loss, params):grads = [param2grad[p.name] for p in params]if hasattr(self, 'clipnorm') and self.clipnorm > 0:norm = K.sqrt(sum([K.sum(K.square(g)) for g in grads]))grads = [clip_norm(g, self.clipnorm, norm) for g in grads]if hasattr(self, 'clipvalue') and self.clipvalue > 0:grads = [K.clip(g, -self.clipvalue, self.clipvalue) for g in grads]return gradsoptim.get_gradients = get_gradientsself.model = modeldef reshape(self, x):shape = list(K.int_shape(x))shape[0] = self.batch_sizereturn K.reshape(x, tuple(shape))def __call__(self):return self.model

为了尽量保持keras代码的完整性,这里我们使用注入的方式实现的HSIC-Bottleneck Trained,动态的调整模型的属性值。

Post-Trained

最后,模型为了完成任务,在最后的隐藏层和模型输出之间添加一个输出层,完成特定的任务。
代码实现:

class PostTrained(object):def __init__(self, model):for layer in model.layers:if layer.name != "output_layer":layer.trainable = Trueelse:# 冻结所有非输出层为不可训练layer.trainable = Falseself.model = modeldef __call__(self):return model

σ\sigmaσ-Network

只使用一个σ\sigmaσ可能无法捕捉到足够多的信息,所以可以使用多个σ\sigmaσ来进行联合训练,读者可以根据上面的代码自己调整实现之。

代码开源在https://github.com/forin-xyz/Keras-HSIC-Bottleneck,可以自己改改。

优点

  1. 不用BP可以避免梯度爆炸/消失;
  2. 可以在某一层没有梯度的情况下跨层优化;
  3. 可以并行同时优化多个层。

缺点

  1. 目前来看效果并不能达到BP算法的效果,机器学习库也没有根据对应算法优化其速度。

一些想法

我们可以HSIC度量作为损失函数的一部分来优化网络,以避免梯度消失的情况下无法优化参数。

不用反向传播的HSIC Bottleneck到底讲了啥,及其keras实现相关推荐

  1. 道理我都懂,但是神经网络反向传播时的梯度到底怎么求?

    作者丨DarkZero@知乎 来源丨https://zhuanlan.zhihu.com/p/25202034 编辑丨极市平台 本文仅用于学术分享.若侵权,请联系后台作删文处理. 相信每一个刚刚入门神 ...

  2. 混淆矩阵怎么看_道理我都懂,但是神经网络反向传播时的梯度到底怎么求?

    ↑ 点击蓝字 关注极市平台作者丨DarkZero@知乎来源丨https://zhuanlan.zhihu.com/p/25202034编辑丨极市平台本文仅用于学术分享.若侵权,请联系后台作删文处理. ...

  3. HSIC不用反向传播也能解决梯度问题

    import numpy as npdef hsic(Kx, Ky):Kxy = np.dot(Kx, Ky)n = Kxy.shape[0]h = np.trace(Kxy) / n**2 + np ...

  4. ztree在刷新时第一个父节点消失_从反向传播推导到梯度消失and爆炸的原因及解决方案(从DNN到RNN,内附详细反向传播公式推导)...

    引言:参加了一家公司的面试和另一家公司的笔试,都问到了这个题!看来很有必要好好准备一下,自己动手推了公式,果然理解更深入了!持续准备面试中... 一. 概述: 想要真正了解梯度爆炸和消失问题,必须手推 ...

  5. 读文献 THE HSIC BOTTLENECK: DEEP LEARNING WITHOUT BACK-PROPAGATION 阅读心得

    题目:THE HSIC BOTTLENECK: DEEP LEARNING WITHOUT BACK-PROPAGATION Abstract 这篇文章介绍了深度学习训练中的HSIC瓶颈(希尔伯特-施 ...

  6. 深度学习的基础知识(机器学习、损失函数、梯度下降、反向传播、基础模型一网打尽)

    1.预备信息 1.1了解技术的发展阶段 技术一般存在几个阶段:1.发展期.2.高峰期.3.冰河期.4.应用期 就是先达到一个高峰,但是在达到高峰之后就会被发现很多问题,然后热度就会不断地下降,到达一个 ...

  7. 反向传播算法(过程及公式推导)_一文讲透神经网络的反向传播,要点介绍与公式推导...

    神经网络的反向传播是什么 神经网络的反向传播,实际上就是逐层计算梯度下降所需要的$w$向量的"变化量"(代价函数$J(w1,b1,w2,b2,w3,b3...wn,bn)$对于$w ...

  8. 【李宏毅2020 ML/DL】P13 Backpropagation | 神经网络反向传播到底是怎么计算的

    我已经有两年 ML 经历,这系列课主要用来查缺补漏,会记录一些细节的.自己不知道的东西. 已经有人记了笔记(很用心,强烈推荐): https://github.com/Sakura-gh/ML-not ...

  9. PyTorch 深度学习实践 第3讲 反向传播

    B站 刘二大人: ch3--反向传播(back propagation) 传送门:https://www.bilibili.com/video/BV1Y7411d7Ys?p=4 一.补充知识: 1. ...

最新文章

  1. MFC之按键消息(长按处理)
  2. 5-35 城市间紧急救援 (25分) pat 数据结构
  3. 数据库常忽略小问题汇总
  4. 通过这个方法竟然可以看到声音传播的速度!?
  5. 代理管家app_亲亲小保社保管家app2021下载_亲亲小保社保管家app最新版下载
  6. android 开源 示波器,上个老外的开源虚拟示波器
  7. LeetCode 629. K个逆序对数组(DP)
  8. pycharm的下载,安装及首次启动
  9. 听力测试英语软件初中,初中生英语听力软件
  10. Cy3014学习记录 二--开发软件使用汇总
  11. 各类邮箱POP3和SMTP服务器地址和端口
  12. 苹果付费app共享公众号_公众号+搭建知识付费网课分销平台聚合型玩法解析
  13. jquery设置输入框为只读_文本框只读_jquery如何设置文本框只读
  14. C语言完美数单循环,《程序设计基础》题库(50道)
  15. 黑马程序员Java零基础视频教程(2022最新Java)B站视频学习笔记-Day15-阶段项目(拼图小游戏)(上篇)
  16. 终于搞清楚了ADO数据库连接中的Persist Security Info参数的作用
  17. 如何通过短视频的方式介绍产品
  18. 应用COMSOL Multiphysics建立裂隙流模型
  19. python-猜字小游戏
  20. 【时间序列】时间序列预测方法总结(对应文章给出详细链接)

热门文章

  1. SV--面向对象class(一)
  2. 【Materials Studio学习四】表面建模(沿某个晶面方向进行切面、表面吸附结构)
  3. html轮播图循环效果,TremulaJS-跨设备多功能的无限循环js轮播图插件
  4. 移动支付(mobile money)系列 —— Service Provider的异同
  5. Google广告AdMob的集成和使用
  6. iuplua 简易记事本开发
  7. ubunto16.04 mysql安装 远程连接配置
  8. 第四讲复习 无线传感器网络技术
  9. 雨水版Redmine常见配置及日常操作
  10. 吉林省计算机水平考试试题,2015吉林省计算机等级考试试题 二级ACCESS必过技巧...