购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 嵌套函数

现在来介绍一个概念,该概念将成为理解神经网络的基础:函数可以被“嵌套”,从而形成“复合”函数。“嵌套”到底是什么意思呢?假设有两个函数,按照数学惯例,它们分别为 ,其中一个函数的输出将成为另一个函数的输入,这样就可以“把它们串在一起”。

数学

嵌套函数在数学上表示为:

这不太直观,因为有个奇怪的地方:嵌套函数是“从外而内”读取的,而而运算实际上是“从内而外”执行的。例如,尽管 读作“ 接受 接受 对象而产生对象 ”,但其真正含义是“首先将 应用于 ,然后将 应用于该结果,最终得到对象 ”。

示意图

要表示嵌套函数,最直观的方法是使用小型工厂表示法,又称盒子表示法。

如图 1-6 所示,输入进入第一个函数,转换之后进行输出。然后,这个输出进入第二个函数并再次转换,得到最终输出。

图 1-6:直观地表示嵌套函数

代码

前面已经介绍了两个维度,接下来从代码维度来认识嵌套函数。首先,为嵌套函数定义一个数据类型:

from typing import List

# 函数接受一个ndarray作为参数并生成一个ndarray
Array_Function = Callable[[ndarray], ndarray]

# 链是一个函数列表
Chain = List[Array_Function]

然后,定义数据如何经过特定长度的链,以长度等于 2 为例,代码如下所示。

def chain_length_2(chain: Chain,
                   a: ndarray) -> ndarray:
    '''
    在一行代码中计算“链”中的两个函数。
    '''
    assert len(chain) == 2, \
    "Length of input 'chain' should be 2"

    f1 = chain[0]
    f2 = chain[1]

    return f2(f1(x))

另一种示意图

使用盒子表示法描述嵌套函数表明,该复合函数实际上就只是一个函数。因此,可以将该函数简单地表示为 ,如图 1-7 所示。

图 1-7:嵌套函数的另一种表示法

此外,在微积分中有一个定理,那就是由“基本可微”的函数组成的复合函数本身就是基本可微的!因此,可以将 视为另一个可计算导数的函数。计算复合函数的导数对于训练深度学习模型至关重要。

但是,现在需要一个公式,以便根据各个组成函数的导数来计算此复合函数的导数。这就是接下来要介绍的内容。 OlhsDLRgBiuXhFWPIJeJ28ADK95lDmDwqUAQYWliQE68IgsPV6El3SA6EdSC7KNP

点击中间区域
呼出菜单
上一章
目录
下一章
×