摘要

本文解释L2正则化Regularization, 求解其在反向传播中的梯度, 并使用TensorFlow和PyTorch验证.

相关

系列文章索引 :

https://blog.csdn.net/oBrightLamp/article/details/85067981

正文

1. L2 正则原理

若某一个神经网络存在一个参数矩阵 Wm×nW_{m\times n}Wm×n​, 该网络在训练时输出一个损失值 error (标量 e0e_0e0​), 对 W 加上L2正则化项后的损失值为 eee. 已知 e0e_0e0​ 对 W 的梯度为 ∇e0(W)\nabla {e_0}_{(W)}∇e0​(W)​, 求 e 对 W 的梯度.

根据题意 :
e=e0+r  r=λ2∑i=1m∑j=1nwij2e = e_0+r\\ \;\\ r = \frac{\lambda}{2}\sum_{i=1}^{m}\sum_{j=1}^{n}w_{ij}^2 e=e0​+rr=2λ​i=1∑m​j=1∑n​wij2​
其中 λ\lambdaλ 为正则项衰减系数, wijw_{ij}wij​ 为矩阵 W 的元素.

梯度求导 :
dedW=de0dW+drdW=∇e0(W)+λW\frac{de}{dW}=\frac{de_0}{dW} + \frac{dr}{dW}=\nabla {e_0}_{(W)} +\lambda W dWde​=dWde0​​+dWdr​=∇e0​(W)​+λW
代入梯度下降公式, 加上正则化项前 :
W(i+1)=W(i)−η∇e0(W)W^{(i+1)} = W^{(i)}-\eta\nabla {e_0}_{(W)} W(i+1)=W(i)−η∇e0​(W)​
加上L2正则化项后 :
W(i+1)=W(i)−η(∇e0(W)+λW)=(1−ηλ)W(i)−η∇e0(W)W^{(i+1)} = W^{(i)}-\eta(\nabla {e_0}_{(W)}+\lambda W)= (1-\eta\lambda)W^{(i)}-\eta\nabla {e_0}_{(W)} W(i+1)=W(i)−η(∇e0​(W)​+λW)=(1−ηλ)W(i)−η∇e0​(W)​
我们可以看到, W 前面乘了一个小于 1 的系数.

故 L2 正则化又称为 L2 惩罚 (penalty) 或权值衰减 (Weight Decay).

2. 程序实现

2.1 TensorFlow

import numpy as np
import tensorflow as tftf.enable_eager_execution()
np.random.seed(123)
np.set_printoptions(8, suppress=True)x_numpy = np.random.random((3, 4)).astype(np.double)
x_tensor = tf.Variable(x_numpy)
w_numpy = np.random.random((4, 5)).astype(np.double)
w_tensor = tf.Variable(w_numpy)weight_decay = 0.9with tf.GradientTape(persistent=True) as tape:loss = tf.reduce_sum(tf.matmul(x_tensor, w_tensor))loss2 = loss + tf.reduce_sum(tf.square(w_tensor)) * weight_decaygrad = tape.gradient(loss, w_tensor).numpy()
grad2 = tape.gradient(loss2, w_tensor).numpy()print("check_grad")
print(grad + 2 * w_numpy * weight_decay)
print(grad2)"""
check_grad
[[ 2.6863001   2.00429027  2.61334972  3.22526179  2.22535517][ 1.41717647  2.05815579  2.05865297  2.24328504  2.63034054][ 2.85481325  2.65063599  2.85119176  2.13211971  2.20201325][ 2.37606803  2.4938795   3.10095124  2.13098311  2.74585633]]
[[ 2.6863001   2.00429027  2.61334972  3.22526179  2.22535517][ 1.41717647  2.05815579  2.05865297  2.24328504  2.63034054][ 2.85481325  2.65063599  2.85119176  2.13211971  2.20201325][ 2.37606803  2.4938795   3.10095124  2.13098311  2.74585633]]
"""

2.2 PyTorch

PyTorch 在 torch.optim.SGD 方法中使用下式实现L2正则化 :
W(i+1)=W(i)−ηG(i)  G(i)=dLdW(i)+λW(i)W^{(i+1)} = W^{(i)}-\eta G^{(i)}\\ \;\\ G^{(i)} =\frac{dL}{dW^{(i)}} + \lambda W^{(i)}\\ W(i+1)=W(i)−ηG(i)G(i)=dW(i)dL​+λW(i)
dLdW(i)\frac{dL}{dW^{(i)}}dW(i)dL​ 是 L2 正则化前的梯度, λ\lambdaλ 是权重衰减系数, G(i)G^{(i)}G(i) 是更新梯度.

验证代码 :

import torch
import numpy as npnp.random.seed(123)
np.set_printoptions(8, suppress=True)x_numpy = np.random.random((3, 4)).astype(np.double)
x_torch = torch.tensor(x_numpy, requires_grad=True)
x_torch2 = torch.tensor(x_numpy, requires_grad=True)w_numpy = np.random.random((4, 5)).astype(np.double)
w_torch = torch.tensor(w_numpy, requires_grad=True)
w_torch2 = torch.tensor(w_numpy, requires_grad=True)lr = 0.1
weight_decay = 0.9
sgd = torch.optim.SGD([w_torch], lr=lr, weight_decay=0)
sgd2 = torch.optim.SGD([w_torch2], lr=lr, weight_decay=weight_decay)y_torch = torch.matmul(x_torch, w_torch)
y_torch2 = torch.matmul(x_torch2, w_torch2)loss = y_torch.sum()
loss2 = y_torch2.sum()sgd.zero_grad()
sgd2.zero_grad()loss.backward()
loss2.backward()sgd.step()
sgd2.step()w_grad = w_torch.grad.data.numpy()
w_grad2 = w_torch2.grad.data.numpy()print("check_grad")
print(w_grad + weight_decay * w_numpy)
print(w_grad2)"""
check_grad
[[ 2.29158508  1.95058016  2.25510989  2.56106592  2.06111261][ 1.25926989  1.57975955  1.58000814  1.67232418  1.86585193][ 2.20280346  2.10071483  2.20099271  1.84145669  1.87640346][ 2.17063112  2.22953686  2.53307273  2.04808866  2.35552527]]
[[ 2.29158508  1.95058016  2.25510989  2.56106592  2.06111261][ 1.25926989  1.57975955  1.58000814  1.67232418  1.86585193][ 2.20280346  2.10071483  2.20099271  1.84145669  1.87640346][ 2.17063112  2.22953686  2.53307273  2.04808866  2.35552527]]"""

L2正则化Regularization详解及反向传播的梯度求导相关推荐

  1. Batch Normalization函数详解及反向传播中的梯度求导

    摘要 本文给出 Batch Normalization 函数的定义, 并求解其在反向传播中的梯度 相关 配套代码, 请参考文章 : Python和PyTorch对比实现批标准化Batch Normal ...

  2. 【机器学习】详解 BackPropagation 反向传播算法!

    首先介绍一下链式法则 假如我们要求z对x1的偏导数,那么势必得先求z对t1的偏导数,这就是链式法则,一环扣一环 BackPropagation(BP)正是基于链式法则的,接下来用简单的前向传播网络为例 ...

  3. 机器学习--多标签softmax + cross-entropy交叉熵损失函数详解及反向传播中的梯度求导

    https://blog.csdn.net/oBrightLamp/article/details/84069835 正文 在大多数教程中, softmax 和 cross-entropy 总是一起出 ...

  4. 实验详解——DNS反向解析、DNS主服务器和从服务器的配置

    实验详解--DNS反向解析.DNS主服务器和从服务器的配置 实验一:DNS反向解析 1.安装bind 2.查找配置文件路径 3.配置/etc/named.conf主配置文件 4.修改/etc/name ...

  5. 学完Nginx/OpenResty详解,反向代理与负载均衡配置,能涨薪多少

    反向代理与负载均衡配置 接下来介绍Nginx的重要功能:反向代理+负载均衡.单体Nginx的性能虽然不错,但也是有瓶颈的.打个比方:用户请求发起一个请求,网站显示的图片量比较大,如果这个时候有大量用户 ...

  6. 「机器学习速成」训练神经网络:反向传播、梯度爆炸消失Dropout

    https://www.toutiao.com/a6706075530187244045/ 2019-06-24 20:38:02 大家好,今天我们学习[机器学习速成]之 训练神经网络. 我们 马上学 ...

  7. AI应用开发基础傻瓜书系列2-神经网络中反向传播与梯度下降的基本概念

    AI应用开发基础傻瓜书系列2-神经网络中反向传播与梯度下降的基本概念 Copyright © Microsoft Corporation. All rights reserved. 适用于Licens ...

  8. 反向传播与梯度下降概念

    反向传播和梯度下降这两个词,第一眼看上去似懂非懂,不明觉厉.这两个概念是整个神经网络中的重要组成部分,是和误差函数/损失函数的概念分不开的. 神经网络训练的最基本的思想就是:先"蒙" ...

  9. 系列之2-神经网络中反向传播与梯度下降的基本概念

    Copyright © Microsoft Corporation. All rights reserved. 适用于License版权许可 更多微软人工智能学习资源,请见微软人工智能教育与学习共建社 ...

最新文章

  1. 1045 Favorite Color Stripe(LIS解法)
  2. java 单个用户的多重并发会话_单个用户的多重并发会话限制/限制单客户端同时登录多个用户...
  3. python图片读取优化_python读取raw binary图片并提取统计信息的实例
  4. UML 10 种常见的域建模错误
  5. Jmeter BeanShell使用json.jar包处理Json数据
  6. WHERE和HAVING子句有什么区别?
  7. Python importlib
  8. [原]linux 修改 hostname 立即生效
  9. php mac windows,苹果电脑是windows系统吗
  10. 如何使用Java代码将GBK编码格式的工程转换为UTF-8编码格式的工程
  11. python种颜色循环_如何用Python做一个RGB和16进制的互转工具
  12. android开发学习——day3
  13. VvvebJs可视化前端设计开发工具
  14. 计算机安全证书有问题怎么办,此网站的安全证书有问题如何取消 此网站的安全证书有问题解决方法...
  15. android apk 重新签名工具,安卓apk重新签名教程,快来定制自己的apk吧
  16. 数据中台和数仓的关系
  17. C/C++ fabs 函数 - C语言零基础入门教程
  18. 报错:IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or
  19. Dataphin核心功能(四):安全——基于数据权限分类分级和敏感数据保护,保障企业数据安全
  20. 什么产品适合做海外众筹

热门文章

  1. Active Directory概述
  2. 网页无法复制的修复方法---Chrome上,最简单的解除“右键限制”的方法 - 书签法
  3. Python 版 Instance Activator
  4. 千亿词霸下载|千亿词霸翻译器
  5. 腾讯桌面整理格子显示位置和通电顺序关系
  6. 浪潮服务器2016销售额,Gartner:2016前三季度,浪潮服务器销售额中国第一
  7. 蓝海创意云丨【渲染制作教程】3层楼室外景观
  8. android mipmap 添加,我们应该如何使用android 4.4添加的mipmap文件夹?
  9. panda 满足条件的行 index_丽江自由行: 我如何安排我从广州到丽江的行程?
  10. 抓包工具 Charles使用教程