Chapter5_误差反向传播法

误差反向传播法

计算图

  1. 用计算图解题
    1. 构建计算图
    2. 在计算图上,从左向右进行计算(正向传播)
  2. 局部计算
    1. 通过传递"局部计算"获得最终结果.
    2. 局部计算指无论全局发生了什么,都能只根据与自己相关的信息输出接下来的结果
  3. 反向传播
    1. 反向传播传递"局部导数"

链式法则

  • 复合函数:由多个函数构成的函数
  • 如果某个函数由复合函数表示,则该复合函数的导数可以用构成复合函数的各个函数的导数的乘积表示

反向传播

加法节点的反向传播

  • 加法节点的反向传播只乘以1,输入的值原封不动地流向下一个节点

乘法节点的反向传播

  • 乘法的反向传播会将上游的值乘以正向传播时的输入信号的"翻转值"后传递给下游.翻转值表示一种翻转关系
  • 实现乘法节点的反向传播时,要保存正向传播的输入信号

简单层的实现

#乘法层的实现
class MulLayer:
    def __init__(self):
        self.x = None
        self.y = None
    def forward(self,x,y):
        self.x = x
        self.y = y
        out = x * y
        
        return out
    
    def backward(self,dout):
        dx = dout * self.y
        dy = dout * self.x 
        
        return dx,dy
#加法层的实现
class AddLayer:
    def __init__(self):
        pass
    
    def forward(self,x,y):
        out = x+y
        return out
    
    def backward(self,dout):
        dx = dout * 1
        dy = dout * 1
        
        return dx,dy
#实现购买2个苹果和3个橘子的例子
apple = 100
apple_num = 2
orange = 150
orange_num = 3
tax = 1.1

#layer
mul_apple_layer = MulLayer()
mul_orange_layer = MulLayer()
add_apple_orange_layer = AddLayer()
mul_tax_layer = MulLayer()

#forward
apple_price = mul_apple_layer.forward(apple,apple_num)
orange_price = mul_orange_layer.forward(orange,orange_num)
all_price = add_apple_orange_layer.forward(apple_price,orange_price)
price = mul_tax_layer.forward(all_price,tax)

#backward
dprice = 1
dall_price,dtax = mul_tax_layer.backward(dprice)
dapple_price,dorange_price = add_apple_orange_layer.backward(dall_price)
dorange,dorange_num = mul_orange_layer.backward(dorange_price)
dapple,dapple_num = mul_apple_layer.backward(dapple_price)

print(price)
print(dapple_num,dapple,dorange,dorange_num,dtax)
715.0000000000001
110.00000000000001 2.2 3.3000000000000003 165.0 650

激活函数层的实现

ReLU层

  • 正向传播时的输入x大于0,则反向传播会将上游的值原封不动地传给下游.
  • 正向传播时的x小于等于0,则反向传播中传给下游的信号将停在此处
#ReLu层的实现
#forward和backward的参数为numpy数组
class Relu:
    def __init__(self):
        self.mask = None
        
    def forward(self,x):
        self.mask = (x<=0)
        out = x.copy()
        out[self.mask]=0
        
        return out
    
    def backward(self,dout):
        dout[self.mask]=0
        dx = dout
        
        return dx

Sigmoid层

y = \frac{1}{1+exp(-x)}

  • 正向传播
    1. "x"节点: x*-1=-x
    2. "exp"节点: exp(-x)
    3. "+"节点: 1+exp(-x)
    4. "/"节点: y=1/(1+exp(-x))
  • 反向传播
      • "/"节点 \begin{aligned}\frac{\partial y}{\partial x} &= -\frac{1}{x^2}\\ &=-y^2\end{aligned}
    * 反向传播时,将上游的值乘以$-y^2$,再传给下游
    
    1. "+"节点将上游的值原封不动地传给下游
    2. "exp"节点 \begin{aligned}\frac{\partial y}{\partial x}&=exp(x)\end{aligned}
    3. "x节点"将正向传播时的值翻转后做乘法运算
  • 反向传播简洁版
    \begin{aligned} \frac{\partial L}{\partial y}&\to \frac{\partial L}{\partial y}y^2exp(-x)\\ &=\frac{\partial L}{\partial y}\frac{1}{(1+exp(-x))^2}exp(-x)\\ &=\frac{\partial L}{\partial y}\frac{1}{1+exp(-x)}\frac{exp(-x)}{1+exp(-x)}\\ &=\frac{\partial L}{\partial y}y(1-y) \end{aligned}
#sigmoid层实现
class Sigmoid:
    def __init__(self):
        self.out = None
    
    def forward(self,x):
        out = 1/(1+np.exp(-x))
        self.out = out
        return out
    
    def backward(self,dout):
        dx = dout*(1.0-self.out)*self.out
        return dx

Affine/Softmax层的实现

Affine层

  • 神经网络的正向传播中进行的矩阵的乘积运算再几何学领域被称为"仿射变换".
  • 进行仿射变换的处理实现为"Affine层"
  • 每个节点间传播的是矩阵
#Affine层实现
class Affine:
    def __init__(self,W,b):
        self.W = W
        self.b = b
        self.x = None
        self.dW = None
        self.db = None
        
    def forward(self,x):
        self.x = x
        out = np.dot(x,self.W)+self.b
        
        return out
    
    def backward(self,dout):
        dx = np.dot(dout,self.W.T)
        self.dW = np.dot(self.x.t,dout)
        self.db = np.sum(dout,axis=0)
        
        return dx

Softmax-with-Loss层

P5-29.png
P5-30.png
  • Softmax层的反向传播得到了(y_1-t_1,y_2-t_2,y_3-t_3)的结果.由于(y_1,y_2,y_3)是Softmax层的输出,(t_1,t_2,t_3)是监督数据,所以(y_1-t_1,y_2-t_2,y_3-t_3)是Softmax层的输出和监督标签的差分.<font color="red">神经网络的反向传播会把这个差分表示的误差传递给前面的层.</font>这是神经网络学习中的重要性质
from sourcecode.common.functions import cross_entropy_error

#Softmax-with-Loss层的实现
class SoftmaxWithLoss:
    def __init__(self):
        self.loss = None #损失
        self.y = None    #softmax的输出
        self.t = None    #监督数据(ont-hot vector)
        
    def forward(self,x,t):
        self.t = t
        self.y = softmax(x)
        self.loss = cross_entropy_error(self.y,self.t)
        
        return self.loss
    
    def backward(self,dout=1):
        batch_size = self.t.shape[0]
        dx = (self.y-self.t)/batch_size
        
        return dx#向前传递的是单个数据的误差
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Android的消息机制主要是指的Handler的运行机制以及Handler所附带的MessageQueue和Lo...
    Desirelife6阅读 836评论 1 8
  • 1. 深度学习有哪些应用 图像:图像识别、物体识别、图片美化、图片修复、目标检测。 自然语言处理:机器创作、个性化...
    mantch阅读 1,789评论 0 14
  • 计算图 用计算图求解 eg.1 太郎在超市买了2个100日元/个的苹果,消费税10%,计算支付金额的过程可以表示成...
    0xFFFFFG阅读 2,070评论 0 1
  • 引言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归、逻辑回归、Soft...
    hfk阅读 4,353评论 4 18
  • 尼莫和叶娅隐居在深山,过着简单和清贫的生活。陪伴他们的,只有一只跟随了他们六年的老母鸡,它原来是一只野鸡,被尼莫找...
    一个都不正经阅读 303评论 0 0