深度学习|求导公式:梯度逆传播规律

news2024/12/23 10:12:52

文章目录

    • 引言
    • 基础函数的求导
      • 常数函数
      • 幂函数
      • 指数函数
      • 对数函数
      • 三角函数
      • 反三角函数
      • 双曲函数
    • 复合函数的梯度逆传播
      • 链式法则
      • 函数相加
      • 函数相乘
      • 函数相除
    • 结语

引言

我们知道,神经网络的能够学习处理任务的核心是计算损失的梯度,而误差逆传播算法是求梯度的一种通用且高效的办法。使用误差逆传播算法求解神经网络的梯度,其实就是求网络中使用的各种基本运算的局部导数的过程。这期我们将回顾各类基本运算的求导公式,然后演示如何将这些公式运用在误差逆传播算法求解网络梯度。

在这里插入图片描述

依赖模块统一导入

此处我们统一导入本文所需的所有依赖模块,下文中不再重复演示。

import numpy as np
import matplotlib.pyplot as plt

作图准备

此处我们准备一个可以绘制下文所有函数图形的 draw 方法,并准备作图用的数据,方便后续演示。

def draw(X, func, func_derivative, title, x_point=1, color='orange', **kwargs):
    """
    绘制函数、切线、导数函数的图形
    :param X: 输入数据
    :param func: 函数
    :param func_derivative: 函数导数
    :param title: 图形标题
    :param x_point: 切线点的 x 轴坐标
    :param color: 图形颜色
    :param kwargs: 函数的参数
    """

    # 创建子图,figsize 参数指定图形的大小为 12 x 5
    fig, axs = plt.subplots(1, 2, figsize=(12, 4.5))

    # 绘制函数图形
    axs[0].plot(X, func(**kwargs)(X), label=title, color=color)
    axs[0].set_title(title)
    axs[0].set_xlabel('Input')
    axs[0].set_ylabel('Output')

    # 绘制在 x_point 处的切线
    func_x_point = func(**kwargs)(x_point)
    func_prime = func_derivative(**kwargs)(x_point)
    tangent_line_func = func_x_point + func_prime * (x - x_point)
    axs[0].plot(x, tangent_line_func,
                label=f"Tangent to {title} at x={x_point}", linestyle=':', color='red')
    axs[0].scatter([x_point], [func_x_point], color='red')

    # legend 函数用于显示图例
    axs[0].legend()
    # grid 函数用于显示网格
    axs[0].grid(True)

    # 绘制导数函数图形
    axs[1].plot(X, func_derivative(**kwargs)(X), label=f"Derivative of {title}", color=color)
    axs[1].set_title(f"Derivative of {title}")
    axs[1].set_xlabel('Input')
    axs[1].set_ylabel('Output')
    axs[1].legend()
    axs[1].grid(True)

    # tight_layout 函数用于调整子图之间的间距
    plt.tight_layout()
    plt.show()

数据准备

# x 从 -2 到 2,等间隔的 400 个点,用于绘制函数图形
x = np.linspace(-2, 2, 400)

基础函数的求导

常数函数

常数函数是指函数的值在定义域内保持为常数 c c c,即:

f ( x ) = c f(x) = c f(x)=c

常数函数的导数为零:

d d x [ c ] = 0 \frac{d}{dx}[c] = 0 dxd[c]=0

使用 Python 实现常数函数及其导数:

def constant_function(c):
    return lambda x: np.full_like(x, c)


def constant_derivative(c):
    return lambda x: np.zeros_like(x)

查看常数函数及其导数的图形:

# 绘制常数 c=1 时,常数函数的图形、常数函数在 x=1.0 处的切线、常数函数的导数图形
draw(x, constant_function, constant_derivative, "Constant Function(c=1)", x_point=1.0, color='blue', c=1)

在这里插入图片描述

常数函数的图形是一条截距为 c c c 的水平直线,其导数为零,导数函数的图形是一条全为零的水平直线。

幂函数

幂函数是指函数的定义域为实数,求关于 x x x n n n 次幂的函数,其中 n n n 是整数,即:

f ( x ) = x n f(x) = x^n f(x)=xn

幂函数 f ( x ) = x n f(x) = x^n f(x)=xn 的导数为:

d d x [ x n ] = n x n − 1 \frac{d}{dx}[x^n] = nx^{n-1} dxd[xn]=nxn1

使用 Python 实现幂函数及其导数:

def power_function(n):
    return lambda x: np.power(x, n)


def power_derivative(n):
    return lambda x: n * np.power(x, n - 1)

查看幂函数及其导数的图形:

# 绘制指数 n=2 时,幂函数的图形、幂函数在 x=1.0 处的切线、幂函数的导数图形
draw(x, power_function, power_derivative, "Power Function(n=2)", x_point=1.0, color='blue', n=2)

在这里插入图片描述

# 绘制指数 n=3 时,幂函数的图形、幂函数在 x=1.0 处的切线、幂函数的导数图形
draw(x, power_function, power_derivative, "Power Function(n=3)", x_point=1.0, color='blue', n=3)

在这里插入图片描述

幂函数的图形是一条经过原点的曲线,其导数为 n x n − 1 nx^{n-1} nxn1,导数函数的图形是一条经过原点的曲线。

指数函数

指数函数是指函数的定义域为实数,求实数 a a a x x x 次幂的函数,即:

f ( x ) = a x f(x) = a^x f(x)=ax

指数函数的导数为:

d d x [ a x ] = a x ln ⁡ ( a ) \frac{d}{dx}[a^x] = a^x \ln(a) dxd[ax]=axln(a)

a = e a=e a=e 时,这个函数被称为自然指数函数:

f ( x ) = e x f(x) = e^x f(x)=ex

自然指数函数的导数为:

d d x [ e x ] = e x \frac{d}{dx}[e^x] = e^x dxd[ex]=ex

使用 Python 实现指数函数及其导数:

def exp_function(a):
    return lambda x: np.exp(x) if a == np.e else np.power(a, x)


def exp_derivative(a):
    return lambda x: np.exp(x) if a == np.e else np.power(a, x) * np.log(a)

查看指数函数及其导数的图形:

# 绘制底数 a=e 时,指数函数的图形、指数函数在 x=1.0 处的切线、指数函数的导数图形
draw(x, exp_function, exp_derivative, "Exp Function(a=e)", x_point=1.0, color='blue', a=np.e)

在这里插入图片描述

draw(x, exp_function, exp_derivative, "Exp Function(a=10)", x_point=1.0, color='blue', a=10)

在这里插入图片描述

对数函数

对数函数是指函数的定义域为正实数,求底数为 a a a 的实数 x x x 的对数的函数,即:

f ( x ) = log ⁡ a ( x ) f(x) = \log_a(x) f(x)=loga(x)

对数函数的导数为:

d d x [ log ⁡ a ( x ) ] = 1 x ln ⁡ ( a ) \frac{d}{dx}[\log_a(x)] = \frac{1}{x \ln(a)} dxd[loga(x)]=xln(a)1

当底数 a = e a=e a=e 时,我们称这样的对数函数为自然对数函数:

f ( x ) = ln ⁡ ( x ) f(x) = \ln(x) f(x)=ln(x)

自然对数函数的导数为:

d d x [ ln ⁡ ( x ) ] = 1 x \frac{d}{dx}[\ln(x)] = \frac{1}{x} dxd[ln(x)]=x1

常用对数 log ⁡ 10 ( x ) \log_{10}(x) log10(x) 的导数:

d d x [ log ⁡ 10 ( x ) ] = 1 x ln ⁡ ( 10 ) \frac{d}{dx}[\log_{10}(x)] = \frac{1}{x \ln(10)} dxd[log10(x)]=xln(10)1

使用 Python 实现对数函数及其导数:

def log_function(base):
    return lambda x: np.log(x) / np.log(base)


def log_derivative(base):
    return lambda x: 1 / (x * np.log(base))

查看对数函数及其导数的图形:

x_log = np.linspace(0.01, 3, 400)
draw(x_log, log_function, log_derivative, "Log Function(base=e)", x_point=1.0, color='blue', base=np.e)

在这里插入图片描述

draw(x_log, log_function, log_derivative, "Log Function(base=10)", x_point=1.0, color='blue', base=10)

在这里插入图片描述

三角函数

三角函数是指函数的定义域为实数,求三角形的角度的函数,常见的三角函数包括正弦函数 sin ⁡ ( x ) \sin(x) sin(x)、余弦函数 cos ⁡ ( x ) \cos(x) cos(x) 和正切函数 tan ⁡ ( x ) \tan(x) tan(x)

正弦函数 sin ⁡ ( x ) \sin(x) sin(x) 的导数:

d d x [ sin ⁡ ( x ) ] = cos ⁡ ( x ) \frac{d}{dx}[\sin(x)] = \cos(x) dxd[sin(x)]=cos(x)

余弦函数 cos ⁡ ( x ) \cos(x) cos(x) 的导数:

d d x [ cos ⁡ ( x ) ] = − sin ⁡ ( x ) \frac{d}{dx}[\cos(x)] = -\sin(x) dxd[cos(x)]=sin(x)

正切函数 tan ⁡ ( x ) \tan(x) tan(x) 的导数:

d d x [ tan ⁡ ( x ) ] = sec ⁡ 2 ( x ) \frac{d}{dx}[\tan(x)] = \sec^2(x) dxd[tan(x)]=sec2(x)

使用 Python 实现三角函数及其导数:

def sin_function():
    return lambda x: np.sin(x)


def sin_derivative():
    return lambda x: np.cos(x)


def cos_function():
    return lambda x: np.cos(x)


def cos_derivative():
    return lambda x: -np.sin(x)


def tan_function():
    return lambda x: np.tan(x)


def tan_derivative():
    return lambda x: 1 / np.cos(x)**2

查看三角函数及其导数的图形:

x_tri = np.linspace(-5, 5, 400)
draw(x_tri, sin_function, sin_derivative, "Sin Function", x_point=1.0, color='blue')

在这里插入图片描述

draw(x_tri, cos_function, cos_derivative, "Cos Function", x_point=1.0, color='blue')

在这里插入图片描述

x_tri = np.linspace(-1.5, 1.5, 100)
draw(x_tri, tan_function, tan_derivative, "Tan Function", x_point=1.0, color='blue')

在这里插入图片描述

反三角函数

反三角函数是指函数的定义域为实数,求三角函数的反函数,常见的反三角函数包括反正弦函数 arcsin ⁡ ( x ) \arcsin(x) arcsin(x)、反余弦函数 arccos ⁡ ( x ) \arccos(x) arccos(x) 和反正切函数 arctan ⁡ ( x ) \arctan(x) arctan(x)

反正弦函数 arcsin ⁡ ( x ) \arcsin(x) arcsin(x) 的导数:

d d x [ arcsin ⁡ ( x ) ] = 1 1 − x 2 \frac{d}{dx}[\arcsin(x)] = \frac{1}{\sqrt{1-x^2}} dxd[arcsin(x)]=1x2 1

反余弦函数 arccos ⁡ ( x ) \arccos(x) arccos(x) 的导数:

d d x [ arccos ⁡ ( x ) ] = − 1 1 − x 2 \frac{d}{dx}[\arccos(x)] = -\frac{1}{\sqrt{1-x^2}} dxd[arccos(x)]=1x2 1

反正切函数 arctan ⁡ ( x ) \arctan(x) arctan(x) 的导数:

d d x [ arctan ⁡ ( x ) ] = 1 1 + x 2 \frac{d}{dx}[\arctan(x)] = \frac{1}{1+x^2} dxd[arctan(x)]=1+x21

使用 Python 实现反三角函数及其导数:

def arcsin_function():
    return lambda x: np.arcsin(x)


def arcsin_derivative():
    return lambda x: 1 / np.sqrt(1 - x**2)


def arccos_function():
    return lambda x: np.arccos(x)


def arccos_derivative():
    return lambda x: -1 / np.sqrt(1 - x**2)


def arctan_function():
    return lambda x: np.arctan(x)


def arctan_derivative():
    return lambda x: 1 / (1 + x**2)

查看反三角函数及其导数的图形:

x_atri = np.linspace(-0.999, 0.999, 100)
draw(x_atri, arcsin_function, arcsin_derivative, "ArcSin Function", x_point=0.25, color='blue')

在这里插入图片描述

draw(x_atri, arccos_function, arccos_derivative, "ArcCos Function", x_point=0.25, color='blue')

在这里插入图片描述

x_atri = np.linspace(-5, 5, 100)
draw(x_atri, arctan_function, arctan_derivative, "ArcTan Function", x_point=0.25, color='blue')

在这里插入图片描述

双曲函数

双曲函数是指函数的定义域为实数,求双曲线的性质的函数,常见的双曲函数包括双曲正弦函数 sinh ⁡ ( x ) \sinh(x) sinh(x)、双曲余弦函数 cosh ⁡ ( x ) \cosh(x) cosh(x) 和双曲正切函数 tanh ⁡ ( x ) \tanh(x) tanh(x)

双曲函数是在数学中类似于常见三角函数的一类函数,用于描述双曲线的几何性质。双曲函数按照与三角函数相似的方式,但专注于双曲线的性质,描述许多自然现象。双曲函数在物理和工程中有广泛应用,如描述悬链线问题等。它们与指数函数有密切的关系,同时也满足许多类似于三角函数的恒等式。

双曲正弦函数 sinh ⁡ ( x ) \sinh(x) sinh(x) 的导数:

d d x [ sinh ⁡ ( x ) ] = cosh ⁡ ( x ) \frac{d}{dx}[\sinh(x)] = \cosh(x) dxd[sinh(x)]=cosh(x)

双曲余弦函数 cosh ⁡ ( x ) \cosh(x) cosh(x) 的导数:

d d x [ cosh ⁡ ( x ) ] = sinh ⁡ ( x ) \frac{d}{dx}[\cosh(x)] = \sinh(x) dxd[cosh(x)]=sinh(x)

双曲正切函数 tanh ⁡ ( x ) \tanh(x) tanh(x) 的导数:

d d x [ tanh ⁡ ( x ) ] = sech 2 ( x ) \frac{d}{dx}[\tanh(x)] = \text{sech}^2(x) dxd[tanh(x)]=sech2(x)

使用 Python 实现双曲函数及其导数:

def sinh_function():
    return lambda x: np.sinh(x)


def sinh_derivative():
    return lambda x: np.cosh(x)


def cosh_function():
    return lambda x: np.cosh(x)


def cosh_derivative():
    return lambda x: np.sinh(x)


def tanh_function():
    return lambda x: np.tanh(x)


def tanh_derivative():
    return lambda x: 1 / np.cosh(x)**2

查看双曲函数及其导数的图形:

x_trih = np.linspace(-5, 5, 100)
draw(x_atri, sinh_function, sinh_derivative, "SinH Function", x_point=0.25, color='blue')

在这里插入图片描述

draw(x_atri, cosh_function, cosh_derivative, "CosH Function", x_point=0.25, color='blue')

在这里插入图片描述

draw(x_atri, tanh_function, tanh_derivative, "TanH Function", x_point=0.25, color='blue')

在这里插入图片描述

复合函数的梯度逆传播

链式法则

链式法则描述的是复合函数的导数计算规则,对于复合函数 f ( g ( x ) ) f(g(x)) f(g(x)),其导数为:

d d x [ f ( g ( x ) ) ] = f ′ ( g ( x ) ) ⋅ g ′ ( x ) \frac{d}{dx}[f(g(x))] = f'(g(x)) \cdot g'(x) dxd[f(g(x))]=f(g(x))g(x)

链式法则是微积分中的一个重要概念,用于计算复合函数的导数。在神经网络中,链式法则被广泛应用于计算损失函数对网络参数的梯度。

函数相加

将两个函数相加得到一个新的函数,即:

f ( x ) = g ( x ) + h ( x ) f(x) = g(x) + h(x) f(x)=g(x)+h(x)

函数相加所得函数的导数为:

f ′ ( x ) = d d x [ g ( x ) + h ( x ) ] = g ′ ( x ) + h ′ ( x ) f'(x) = \frac{d}{dx}[g(x) + h(x)] = g'(x) + h'(x) f(x)=dxd[g(x)+h(x)]=g(x)+h(x)

若自变量不唯一,如:

f ( x , y ) = g ( x ) + h ( y ) f(x, y) = g(x) + h(y) f(x,y)=g(x)+h(y)

此时,函数相加所得函数关于自变量的偏导数分别为:

∂ ∂ x [ f ( x , y ) ] = ∂ g ( x ) ∂ x + ∂ h ( y ) ∂ x = ∂ g ( x ) ∂ x + 0 = g ′ ( x ) \frac{\partial}{\partial x}[f(x, y)] = \frac{\partial g(x)}{\partial x} + \frac{\partial h(y)}{\partial x} = \frac{\partial g(x)}{\partial x} + 0 = g'(x) x[f(x,y)]=xg(x)+xh(y)=xg(x)+0=g(x)

∂ ∂ y [ f ( x , y ) ] = ∂ g ( x ) ∂ y + ∂ h ( y ) ∂ y = 0 + ∂ h ( y ) ∂ y = h ′ ( y ) \frac{\partial}{\partial y}[f(x, y)] = \frac{\partial g(x)}{\partial y} + \frac{\partial h(y)}{\partial y} = 0 + \frac{\partial h(y)}{\partial y} = h'(y) y[f(x,y)]=yg(x)+yh(y)=0+yh(y)=h(y)

f = g + h f = g + h f=g+h 的计算传播图如下:

在这里插入图片描述

g ( x ) g(x) g(x) 处的梯度为:

d f d g × d f = d f d x d g d x × d f = d g d x + d h d x d g d x × d f = d g d x + 0 d g d x × d f = d f \frac{df}{dg} \times df = \frac{\frac{df}{dx}}{\frac{dg}{dx}} \times df = \frac{\frac{dg}{dx} + \frac{dh}{dx}}{\frac{dg}{dx}} \times df = \frac{\frac{dg}{dx} + 0}{\frac{dg}{dx}} \times df = df dgdf×df=dxdgdxdf×df=dxdgdxdg+dxdh×df=dxdgdxdg+0×df=df

h ( y ) h(y) h(y) 处的梯度为:

d f d h × d f = d f d y d h d y × d f = d g d y + d h d y d h d y × d f = 0 + d h d y d h d y × d f = d f \frac{df}{dh} \times df = \frac{\frac{df}{dy}}{\frac{dh}{dy}} \times df = \frac{\frac{dg}{dy} + \frac{dh}{dy}}{\frac{dh}{dy}} \times df = \frac{0 + \frac{dh}{dy}}{\frac{dh}{dy}} \times df = df dhdf×df=dydhdydf×df=dydhdydg+dydh×df=dydh0+dydh×df=df

由此可见,函数相加的梯度逆传播是直接将下游梯度 df 传递给上游,不会发生梯度的变化。

函数相乘

将两个函数相乘得到一个新的函数,即:

f ( x ) = g ( x ) ⋅ h ( x ) f(x) = g(x) \cdot h(x) f(x)=g(x)h(x)

函数相乘所得函数的导数为:

d d x [ f ( x ) g ( x ) ] = f ′ ( x ) g ( x ) + f ( x ) g ′ ( x ) \frac{d}{dx}[f(x)g(x)] = f'(x)g(x) + f(x)g'(x) dxd[f(x)g(x)]=f(x)g(x)+f(x)g(x)

若自变量不唯一,如:

f ( x , y ) = g ( x ) ⋅ h ( y ) f(x, y) = g(x) \cdot h(y) f(x,y)=g(x)h(y)

此时,函数相乘所得函数关于自变量的偏导数分别为:

∂ ∂ x [ f ( x , y ) ] = ∂ g ( x ) ∂ x ⋅ h ( y ) + g ( x ) ⋅ ∂ h ( y ) ∂ x = ∂ g ( x ) ∂ x ⋅ h ( y ) + g ( x ) ⋅ 0 = g ′ ( x ) ⋅ h ( y ) \frac{\partial}{\partial x}[f(x, y)] = \frac{\partial g(x)}{\partial x} \cdot h(y) + g(x) \cdot \frac{\partial h(y)}{\partial x} = \frac{\partial g(x)}{\partial x} \cdot h(y) + g(x) \cdot 0 = g'(x) \cdot h(y) x[f(x,y)]=xg(x)h(y)+g(x)xh(y)=xg(x)h(y)+g(x)0=g(x)h(y)

∂ ∂ y [ f ( x , y ) ] = ∂ g ( x ) ∂ y ⋅ h ( y ) + g ( x ) ⋅ ∂ h ( y ) ∂ y = 0 ⋅ h ( y ) + g ( x ) ⋅ h ′ ( y ) = g ( x ) ⋅ h ′ ( y ) \frac{\partial}{\partial y}[f(x, y)] = \frac{\partial g(x)}{\partial y} \cdot h(y) + g(x) \cdot \frac{\partial h(y)}{\partial y} = 0 \cdot h(y) + g(x) \cdot h'(y) = g(x) \cdot h'(y) y[f(x,y)]=yg(x)h(y)+g(x)yh(y)=0h(y)+g(x)h(y)=g(x)h(y)

f = g ⋅ h f = g \cdot h f=gh 的计算传播图如下:

在这里插入图片描述

g ( x ) g(x) g(x) 处的梯度为:

d f d g × d f = d f d x d g d x × d f = d g d x ⋅ h ( y ) + g ( x ) ⋅ d h d x d g d x × d f = d g d x ⋅ h ( y ) + 0 d g d x × d f = h ( y ) ⋅ d f \begin{split} \frac{df}{dg} \times df = \frac{\frac{df}{dx}}{\frac{dg}{dx}} \times df \\ = \frac{\frac{dg}{dx} \cdot h(y) + g(x) \cdot \frac{dh}{dx}}{\frac{dg}{dx}} \times df \\ = \frac{\frac{dg}{dx} \cdot h(y) + 0}{\frac{dg}{dx}} \times df \\ = h(y) \cdot df \end{split} dgdf×df=dxdgdxdf×df=dxdgdxdgh(y)+g(x)dxdh×df=dxdgdxdgh(y)+0×df=h(y)df

h ( y ) h(y) h(y) 处的梯度为:

d f d h × d f = d f d y d h d y × d f = d g d y ⋅ h ( y ) + g ( x ) ⋅ d h d y d h d y × d f = 0 ⋅ h ( y ) + g ( x ) ⋅ d h d y d h d y × d f = g ( x ) ⋅ d f \begin{split} \frac{df}{dh} \times df = \frac{\frac{df}{dy}}{\frac{dh}{dy}} \times df \\ = \frac{\frac{dg}{dy} \cdot h(y) + g(x) \cdot \frac{dh}{dy}}{\frac{dh}{dy}} \times df \\ = \frac{0 \cdot h(y) + g(x) \cdot \frac{dh}{dy}}{\frac{dh}{dy}} \times df \\ = g(x) \cdot df \end{split} dhdf×df=dydhdydf×df=dydhdydgh(y)+g(x)dydh×df=dydh0h(y)+g(x)dydh×df=g(x)df

由此可见,函数相乘的梯度逆传播,两个函数 g(x)h(y) 的梯度分是将下游梯度 df 乘以相乘函数 h(y)g(x)

函数相除

将两个函数相除得到一个新的函数,即:

f ( x ) = g ( x ) h ( x ) f(x) = \frac{g(x)}{h(x)} f(x)=h(x)g(x)

函数相除所得函数的导数为:

d d x [ g ( x ) h ( x ) ] = g ′ ( x ) h ( x ) − g ( x ) h ′ ( x ) [ h ( x ) ] 2 \frac{d}{dx}\left[\frac{g(x)}{h(x)}\right] = \frac{g'(x)h(x) - g(x)h'(x)}{[h(x)]^2} dxd[h(x)g(x)]=[h(x)]2g(x)h(x)g(x)h(x)

若自变量不唯一,如:

f ( x , y ) = g ( x ) h ( y ) f(x, y) = \frac{g(x)}{h(y)} f(x,y)=h(y)g(x)

此时,函数相除所得函数关于自变量的偏导数分别为:

∂ ∂ x [ g ( x ) h ( y ) ] = ∂ g ( x ) ∂ x ⋅ h ( y ) − g ( x ) ⋅ ∂ h ( y ) ∂ x [ h ( y ) ] 2 = g ′ ( x ) ⋅ h ( y ) − g ( x ) ⋅ 0 [ h ( y ) ] 2 = g ′ ( x ) ⋅ h ( y ) [ h ( y ) ] 2 \begin{split} \frac{\partial}{\partial x}\left[\frac{g(x)}{h(y)}\right] = \frac{\frac{\partial g(x)}{\partial x} \cdot h(y) - g(x) \cdot \frac{\partial h(y)}{\partial x}}{[h(y)]^2} \\ = \frac{g'(x) \cdot h(y) - g(x) \cdot 0}{[h(y)]^2} \\ = \frac{g'(x) \cdot h(y)}{[h(y)]^2} \end{split} x[h(y)g(x)]=[h(y)]2xg(x)h(y)g(x)xh(y)=[h(y)]2g(x)h(y)g(x)0=[h(y)]2g(x)h(y)

∂ ∂ y [ g ( x ) h ( y ) ] = ∂ g ( x ) ∂ y ⋅ h ( y ) − g ( x ) ⋅ ∂ h ( y ) ∂ y [ h ( y ) ] 2 = 0 ⋅ h ( y ) − g ( x ) ⋅ h ′ ( y ) [ h ( y ) ] 2 = − g ( x ) ⋅ h ′ ( y ) [ h ( y ) ] 2 \begin{split} \frac{\partial}{\partial y}\left[\frac{g(x)}{h(y)}\right] = \frac{\frac{\partial g(x)}{\partial y} \cdot h(y) - g(x) \cdot \frac{\partial h(y)}{\partial y}}{[h(y)]^2} \\ = \frac{0 \cdot h(y) - g(x) \cdot h'(y)}{[h(y)]^2} \\ = -\frac{g(x) \cdot h'(y)}{[h(y)]^2} \end{split} y[h(y)g(x)]=[h(y)]2yg(x)h(y)g(x)yh(y)=[h(y)]20h(y)g(x)h(y)=[h(y)]2g(x)h(y)

f = g h f = \frac{g}{h} f=hg 的计算传播图如下:

在这里插入图片描述

g ( x ) g(x) g(x) 处的梯度为:

d f d g × d f = d f d x d g d x × d f = g ′ ( x ) ⋅ h ( y ) [ h ( y ) ] 2 g ′ ( x ) × d f = h ( y ) [ h ( y ) ] 2 × d f = d f h ( y ) \begin{split} \frac{df}{dg} \times df = \frac{\frac{df}{dx}}{\frac{dg}{dx}} \times df \\ = \frac{\frac{g'(x) \cdot h(y)}{\left[h(y)\right]^2}}{g'(x)} \times df \\ = \frac{h(y)}{[h(y)]^2} \times df \\ = \frac{df}{h(y)} \end{split} dgdf×df=dxdgdxdf×df=g(x)[h(y)]2g(x)h(y)×df=[h(y)]2h(y)×df=h(y)df

h ( y ) h(y) h(y) 处的梯度为:

d f d h × d f = d f d y d h d y × d f = g ( x ) ⋅ h ′ ( y ) [ h ( y ) ] 2 h ′ ( y ) × d f = g ( x ) [ h ( y ) ] 2 ⋅ d f \begin{split} \frac{df}{dh} \times df = \frac{\frac{df}{dy}}{\frac{dh}{dy}} \times df \\ = \frac{\frac{g(x) \cdot h'(y)}{[h(y)]^2}}{h'(y)} \times df \\ = \frac{g(x)}{[h(y)]^2} \cdot df \end{split} dhdf×df=dydhdydf×df=h(y)[h(y)]2g(x)h(y)×df=[h(y)]2g(x)df

由此可见,函数相除的梯度逆传播中,被除数 g(x) 的梯度是将下游梯度 df 除以除数 h(y),除数 h(y) 的梯度是将下游梯度 df 乘以被除数 g(x) 再除以除数的平方 [ h ( y ) ] 2 [h(y)]^2 [h(y)]2

结语

神经网络学习的核心是计算损失函数的梯度,即求损失函数关于网络参数的偏导数。而网络的计算可以理解成一系列基本运算的复合,因此我们可以通过了解这些基本运算的导数求解方式,以及结合链式法则归纳出这些基本运算的复合形式的求导规律,来完成网络的梯度的高效计算。这就是误差逆传播算法的基本原理。

误差逆传播算法是训练人工神经网络最基本的方法,它通过计算每个神经元的梯度,优化网络的权重以使得输出误差最小化。误差逆传播算法是神经网络的学习核心,是它使得人工神经网络成为一种可行的机器学习模型,可以说没有误差逆传播算法就没有今天人工神经网络的流行。


PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!


  • 上一篇:深度学习|误差逆传播:梯度速解
  • 专栏:「数智通识」 | 「机器学习」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于OpenCV的实时年龄与性别识别(支持CPU和GPU)

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

842真题上的各种简答题

线性表 1. 应选用链式存储结构,因为链式存储结构采取动态内存分配,可以在操作过程中增加或减少线性表的长度,且插入删除操作更方便 2应该选用顺序存储结构,因为顺序存储结构的访问和存取,都是按照元素序号的随机访问…

VisualGLM-6B——原理与部署

VisualGLM-6B技术原理介绍 VisualGLM-6B 是一种多模态预训练模型,它旨在将视觉和语言模型进行结合,使得语言模型能够理解图像信息并与文本对话无缝结合。为了更好地理解 VisualGLM-6B 的内容,我们可以从以下几个方面来解析它的原理、结构、训…

基于springboot+小程序的自习室选座与门禁管理系统(自习室1)(源码+sql脚本+视频导入教程+文档)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 1、管理员实现了首页、基础数据管理、论坛管理、公告信息管理、用户管理、座位管理等 2、用户实现了在论坛模块通过发帖与评论帖子的方式进行信息讨论,也能对账户进行在线充值…

低代码可视化-uniapp蓝牙标签打印-代码生成器

蓝牙标签打印 蓝牙标签打印技术结合了蓝牙通信与标签打印的功能,为用户提供了一种便捷、高效的打印解决方案。以下是对蓝牙标签打印的详细解析: 蓝牙标签打印机的特点 无线连接:蓝牙标签打印机最大的亮点在于其无线连接方式。用户可以通过蓝…

【Redis基础篇】超详细♥Redis安装教程、5种常用数据结构和常见命令、Jedis和SpringDataRedis的使用

文章目录 一、Redis与客户端安装教程1、NoSQL介绍(1)结构化与非结构化(2)关联和非关联(3)查询方式(4)事务(5)总结 2、Redis介绍3、安装Redis(1&am…

毕业论文设计javaweb+VUE高校教师信息管理系统

目录 一、系统概述 二、功能详解 1. 教师管理 2. 部门管理 3. 奖惩管理 4. 业绩管理 5. 培训管理 6. 报表查询 三、总结 四、示例代码 1 前端VUE 2 后端SpringBootjava 3 数据库表 随着教育信息化的发展,传统的手工管理方式已经不能满足现代学校对教师…

Python安装流程(Windows + MAC)

目录 Windows 版 1.下载Python 2.开始安装 3.配置环境变量 4.测试python是否成功安装 MAC版 1.下载Python 2.开始安装 Windows 版 1.下载Python 进入Python官网下载:(Python更新频繁,下载最新版即可,安装流程一致&#x…

打印机共享错误11b解决方法介绍

共享打印机遇见各种错误,例如0x00000709,0x0000011b,浪费大量的时间去尝试各种方法去解决此问题,最终结果还是也连接共享失败?这个时候就说是不是系统有问题了,绝大多数的情况下是把电脑的系统重新安装了一遍&#xff…

前端工程规范-4:Git提交前代码规范检查(Husky + Lint-staged)

Git提交前代码规范检查 在前端项目开发中,规范git提交信息,也是经常使用的手段,如何确保团队成员都遵循ESint规则,且不会将不符合规范的代码推送到Git仓库? 答案是:使用带有git hooks功能的husky。git hoo…

文心一言 VS 讯飞星火 VS chatgpt (357)-- 算法导论24.2 3题

三、上面描述的 PERT 图的公式有一点不太自然。在一个更自然的结构下,图中的结点代表要执行的工作,边代表工作之间的次序限制,即边 (u,v) 表示工作 u 必须在工作 v 之前执行。在这种结构的图中,我们将权重赋给结点&…

SQL中基本SELECT语句及常见关键字的使用(内连接,左/右连接)

这里写目录标题 SQL中基本SELECT语句的使用SQL语法简介DDL、DML、DCLSEECT SELECT常用关键词group by分组having筛选limit限定条数UION和UION ALL合并SQL执行顺序 联表查询多表查询示例特殊用法:笛卡尔积(交叉连接)等值连接vs非等值连接自连接…

ResNet18果蔬图像识别分类

关于深度实战社区 我们是一个深度学习领域的独立工作室。团队成员有:中科大硕士、纽约大学硕士、浙江大学硕士、华东理工博士等,曾在腾讯、百度、德勤等担任算法工程师/产品经理。全网20多万粉丝,拥有2篇国家级人工智能发明专利。 社区特色…

接口隔离原则(学习笔记)

客户端不应该被迫依赖于它不使用的方法:一个类对另一个类的依赖应该建立在最小的接口上。 上面的设计我们发现他存在的问题,黑马品牌的安全门具有防盗,防水,防火的功能。现在如果我们还需要再创建一盒传智品牌的安全门&#xff0c…

王道-计网

2 采用滑动窗口机制对两个相邻结点A(发送方)和B(接收方)的通信过程进行流量控制。假定帧的序号长度为3比特,发送窗口与接收窗口的大小均为7,当A发送了编号为0、1、2、3这4个帧后,而B接收了这4个帧,但仅应答了0、1两个帧,A继续发送4、5两个帧,且这两个帧已进入B的接收…

Oracle 表空间时间点恢复

已有一个数据库全备,在PDB中恢复被drop掉的表空间 1.新建表空间 create tablespace PITR_TBS datafile /u01/app/oracle/oradata/PRODCDB/PDBPROD2/PITR_TBS01.dbf size 10m; 2.使用RMAN备份. backup as compressed backupset database INCLUDE CURRENT CONTROLFI…

秘AI模型登顶评分网站:网友猜测是F.1新作诞生?

神秘的 AI 生成模型 就在近日,有一个“幽灵模型”直接登顶了模型评测网站,直接力压近期爆火的 Flux.1 等一众模型。但奇怪的是这个名为 Blueberry 的模型却没有任何一家公司或团队出来“认领”。这件事情也引发了众多人的讨论。 疑似 Flux 团队续作 幽灵…

ADRC线性跟踪微分器TD详细测试(Simulink 算法框图+CODESYS ST+博途SCL完整源代码)

1、ADRC线性跟踪微分器 ADRC线性跟踪微分器(ST+SCL语言)_adrc算法在博途编程中scl语言-CSDN博客文章浏览阅读784次。本文介绍了ADRC线性跟踪微分器的算法和源代码,包括在SMART PLC和H5U平台上的实现。文章提供了ST和SCL语言的详细代码,并讨论了跟踪微分器在自动控制中的作用…

【车载开发系列】ParaSoft单元测试环境配置(四)

【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四) 【车载开发系列】ParaSoft单元测试环境配置(四)一. 如何设置过滤二. 如何设置静态扫描的规则三. 如何设置单个测试用例的超时时间四. 如何获取测试用例的数量五. 如何设置Gc…

数字图像处理:边缘检测

数字图像处理:边缘检测 笔记来源: 1.Gradient and Laplacian Filter, Difference of Gaussians (DOG) 1.1 图像一阶梯度 水平方向的一阶导数 一阶导数滤波器在实际应用中难实现的原因 图像梯度中,一阶梯度中找局部极大值就是边缘所在处&a…