从函数逼近角度理解神经网络、残差连接与激活函数

2024-06-23 21:12

本文主要是介绍从函数逼近角度理解神经网络、残差连接与激活函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

最近思考激活函数的时候,突然想到神经网络中残差连接是不是和函数的泰勒展开很像,尤其是在激活函数 f ( x ) = x 2 f(x)=x^2 f(x)=x2时(这个激活函数想法来源于 f ( x ) = R e L U 2 ( x ) [ 3 ] f(x)=ReLU^2(x)[3] f(x)=ReLU2(x)[3]),所以验证了一下就顺便写下来了,本文抛砖引玉,如果有建议或更好的想法可以写到评论区。

常见函数的泰勒展开

这里仅简单写几个函数的泰勒公式,其他可查看参考文章[1]
s i n ( x ) = x − x 3 3 ! ​ + x 5 5 ! ​ − x 7 7 ! ​ + o ( x 7 ) sin(x) =x−\frac{x^3}{3!}​+\frac{x^5}{5!} ​−\frac{x^7}{7!} ​+o(x^7) sin(x)=x3!x3+5!x57!x7+o(x7) c o s ( x ) = 1 − x 2 2 ! ​ + x 4 4 ! ​ − x 6 6 ! ​ + o ( x 6 ) cos(x)=1−\frac{x^2}{2!} ​+\frac{x^4}{4!} ​−\frac{x^6}{6!}​+o(x^6) cos(x)=12!x2+4!x46!x6+o(x6) e x = 1 + x + x 2 2 ! + x 3 3 ! ​ + x 4 4 ! + x 5 5 ! + o ( x 5 ) e^x=1+x+\frac{x^2}{2!}+\frac{x^3}{3!}​+\frac{x^4}{4!}+\frac{x^5}{5!}+o(x^5) ex=1+x+2!x2+3!x3+4!x4+5!x5+o(x5)
其中 o ( x n ) o(x^n) o(xn)表示皮亚诺(Peano)余项

函数逼近(多项式逼近)

在统计计算和其它科学计算中, 经常需要计算各种函数的值, 对函数进行逼近, 用数值方法计算积分、微分。(这里摘录部分多项式逼近的内容)

数学中的超越函数如 e x , l n ( x ) , s i n ( x ) e^x,ln(x),sin(x) ex,ln(x),sin(x)在计算机中经常用泰勒级数展开来计算, 这就是用多项式来逼近函数。 数学分析中的Weirstrass定理表明, 闭区间上的连续函数可以用多项式一致逼近。 泰勒展开要求函数有多阶导数, 我们需要找到对更一般函数做多项式逼近的方法[2]。

考虑如下的函数空间
L 2 [ a , b ] = { g ( ⋅ ) : g ( x ) ∈ [ a , b ] , ∫ a b g 2 ( x ) w ( x ) d x < ∞ } ( 2.1 ) L^2[a,b]=\left \{ g(\cdot ): g(x)\in [a,b],\int_{a}^{b} g^2(x)w(x)dx<\infty \right \} \quad (2.1) L2[a,b]={g():g(x)[a,b],abg2(x)w(x)dx<}(2.1)则是 L 2 [ a , b ] L^2[a,b] L2[a,b]线性空间,在 L 2 [ a , b ] L^2[a,b] L2[a,b]中定义内积
< f , g > = ∫ a b f ( x ) g ( x ) w ( x ) d x ( 2.2 ) <f,g>=\int_{a}^{b} f(x)g(x)w(x)dx \quad (2.2) <f,g>=abf(x)g(x)w(x)dx(2.2) 其中 w ( x ) w(x) w(x)是适当的权重函数, L 2 [ a , b ] L^2[a,b] L2[a,b]则为希尔伯特(Hilbert)空间。 对 g ( x ) ∈ L 2 [ a , b ] g(x)\in L^2[a,b] g(x)L2[a,b], 假设希望用 n n n阶多项式 f n ( x ) f_n(x) fn(x)逼近,使得
∥ f n − g ∥ 2 = ∫ a b ∣ f n ( x ) − g ( x ) ∣ 2 w ( x ) d x ( 2.3 ) \left \| f_n-g \right \|^2=\int_{a}^{b} \left | f_n(x)-g(x) \right |^2 w(x)dx \quad (2.3) fng2=abfn(x)g(x)2w(x)dx(2.3)最小。 如何求这样的多项式?

用Gram-Schmidt正交化方法可以在 L 2 [ a , b ] L^2[a,b] L2[a,b]中把多项式序列 { 1 , x , x 2 , … } \left \{ 1,x,x^2,\dots \right \} {1,x,x2,} 正交化为正交序列 { P 0 , P 1 , P 2 , … } \left \{ P_0,P_1,P_2,\dots \right \} {P0,P1,P2,}, 序列中函数彼此正交,且 P k P_k Pk k k k阶多项式, 称 { P 0 , P 1 , P 2 , … } \left \{ P_0,P_1,P_2,\dots \right \} {P0,P1,P2,}为正交多项式。 设 H n [ a , b ] H_n[a,b] Hn[a,b]为函数 { 1 , x , x 2 , … , x n } \left \{ 1,x,x^2,\dots,x^n \right \} {1,x,x2,,xn}的线性组合构成的线性空间, 则 { P 0 , P 1 , … , P n } \left \{ P_0,P_1,\dots,P_n \right \} {P0,P1,,Pn}构成 H n [ a , b ] H_n[a,b] Hn[a,b]的正交基且 P n [ a , b ] P_n[a,b] Pn[a,b] L 2 [ a , b ] L^2[a,b] L2[a,b]的子希尔伯特空间, 使得加权平方距离 ( 2.3 ) (2.3) (2.3)最小的 f n ( x ) f_n(x) fn(x) g ( ⋅ ) g(\cdot) g()在子空间 H n [ a , b ] H_n[a,b] Hn[a,b]的投影, 记为 P ~ H n [ a , b ] ( g ) \tilde{P}_{H_n[a,b]}(g) P~Hn[a,b](g), 投影可以表示为 { P 0 , P 1 , … , P n } \left \{ P_0,P_1,\dots,P_n \right \} {P0,P1,,Pn}的线性组合
P ~ H n [ a , b ] ( g ) = ∑ j = 0 n < g , P j > ∥ P j ∥ 2 P j ⋅ \tilde{P}_{H_n[a,b]}(g) = \sum_{j=0}^{n} \frac{<g,P_j>}{\left \| P_j \right \|^2 } P_j\cdot P~Hn[a,b](g)=j=0nPj2<g,Pj>Pj 这样,只要预先找到 [ a , b ] [a,b] [a,b]上的多项式的正交基, 通过计算内积就可以很容易地找到使得 ( 2.3 ) (2.3) (2.3)公式最小的 f n ( x ) f_n(x) fn(x)。 对于 L 2 [ a , b ] L^2[a,b] L2[a,b]中的任意函数 g ( x ) g(x) g(x)
lim ⁡ n → ∞ ∥ P ~ H n [ a , b ] ( g ) − g ∥ 2 = 0 \lim_{n \to \infty}\left \| \tilde{P}_{H_n[a,b]}(g)-g \right \|^2=0 nlim P~Hn[a,b](g)g 2=0 于是有
g = lim ⁡ n → ∞ P ~ H n [ a , b ] ( g ) = ∑ j = 0 ∞ < g , P j > ∥ P j ∥ 2 P j ⋅ g=\lim_{n \to \infty} \tilde{P}_{H_n[a,b]}(g) = \sum_{j = 0}^{\infty} \frac{<g,P_j>}{\left \| P_j \right \|^2 } P_j\cdot g=nlimP~Hn[a,b](g)=j=0Pj2<g,Pj>Pj 因为 L 2 [ a , b ] L^2[a,b] L2[a,b]依赖于定义域 [ a , b ] [a,b] [a,b]和权重函数 w ( ⋅ ) w(\cdot) w(), 所以正交多项式也依赖于 [ a , b ] [a,b] [a,b] w ( ⋅ ) w(\cdot) w()。 针对定义域 [ − 1 , 1 ] [-1,1] [1,1], [ 0 , ∞ ] [0,\infty] [0,] [ − ∞ , ∞ ] [-\infty,\infty] [,] 和几种不同的权重函数可以得到不同的正交多项式序列,详细参考[2]

神经网络、残差连接与多项式逼近

神经网络一般由层的参数、激活函数、及层间连接构成,对于神经网络(无跨层连接),可以定义其函数 F : R m ⟶ R n F:R^{m}\longrightarrow R^{n} F:RmRn 的带参数的形式为:
F n ( x ; θ ) = f 1 ∘ g 1 ∘ f 2 ∘ g 2 ∘ ⋯ ∘ f n ∘ g n F_n(x; \theta) = f_{1} \circ g_1\circ f_{2} \circ g_2 \circ \dots \circ f_{n} \circ g_n Fn(x;θ)=f1g1f2g2fngn其中 g g g为激活函数, f f f为全连接函数。一般在神经网络中 f i = w i x + b i f_i=w_ix+b_i fi=wix+bi,这里为了方便我们去掉bias项,即 f i = w i x f_i=w_i x fi=wix,首先假设 g = x g=x g=x 即线性的激活函数,且为了简单 w , x w,x w,x都假设为标量,我们可以得到:

    F 1 = w 1 x F_1=w_1x F1=w1x
    F 2 = w 2 F 1 = w 2 w 1 x F_2=w_2 F_1=w_2w_1x F2=w2F1=w2w1x
    … \dots
    F n = ( ∏ i = 1 n w i ) x F_n=(\prod_{i=1}^{n}w_i)x Fn=(i=1nwi)x

所以我们会发现,由线性的激活函数构成的网络仍然为线性的,即 ∏ i = 1 n w i \prod_{i=1}^{n}w_i i=1nwi是一个常数,所以无论有多少层,网络都是线性的,同理加残差连接也是线性的。

为了获得非线性,我们可以假设 g = x 2 g=x^2 g=x2,这时我们也可以得到递推公式

    F 1 = ( w 1 ) 2 x 2 F_1=(w_1)^2x^2 F1=(w1)2x2
    F 2 = ( w 2 F 1 ) 2 = ( w 2 ) 2 ( w 1 ) 4 x 4 F_2=(w_2 F_1)^2=(w_2)^2(w_1)^4x^4 F2=(w2F1)2=(w2)2(w1)4x4
    … \dots
    F n = ( ∏ i = 1 n ( w i ) 2 n − i + 1 ) x 2 n F_n=(\prod_{i=1}^{n}(w_i)^{2^{n-i+1}})x^{2^n} Fn=(i=1n(wi)2ni+1)x2n

我们也会发现,由非线性的激活函数构成的网络为非线性的,这里可以根据残差网络加入跨层连接。

    F 1 = ( w 1 ) 2 x 2 + x F_1=(w_1)^2x^2 + x F1=(w1)2x2+x
    F 2 = ( w 2 F 1 ) 2 + F 1 = ( w 2 ) 2 ( w 1 ) 4 x 4 + 2 ( w 1 w 2 ) 2 x 3 + ( ( w 2 ) 2 + ( w 1 ) 2 ) x 2 + x F_2=(w_2 F_1)^2+F_1=(w_2)^2(w_1)^4x^4+2(w_1w_2)^2x^3+((w_2)^2+(w_1)^2)x^2+x F2=(w2F1)2+F1=(w2)2(w1)4x4+2(w1w2)2x3+((w2)2+(w1)2)x2+x
    … \dots
    F n = c 0 x + c 1 x 2 + c 2 x 3 + c 3 x 4 + . . . + c 2 n − 1 x 2 n F_n=c_0x+c_1x^{2}+c_2x^{3}+c_3x^{4}+...+c_{2n-1}x^{2^n} Fn=c0x+c1x2+c2x3+c3x4+...+c2n1x2n

递推公式太复杂了,为了方便这里 F n F_n Fn不再在里面写 w w w参数了,而是合并作为参数 c c c。从这里我们就可以看到残差网络的作用,是作为函数的n次多项式逼近,和泰勒展开是基本一致的。所以相比于直接使用高阶项,残差网络带来的多项式逼近有更好的函数拟合效果。

这里只是讨论了 g = x 2 g=x^2 g=x2的情形,其他激活函数的级数公式会更加复杂,总体是一个低阶到高阶的加和函数。

利用激活实现函数多项式逼近

先发后改,后面再修改补充。。。

参考文章

  1. 泰勒公式、麦克劳林公式、欧拉公式
  2. 函数逼近 | 统计计算
  3. ReLU 2 ^2 2 Wins: Discovering Efficient Activation Functions for Sparse LLMs

这篇关于从函数逼近角度理解神经网络、残差连接与激活函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1088289

相关文章

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

python连接本地SQL server详细图文教程

《python连接本地SQLserver详细图文教程》在数据分析领域,经常需要从数据库中获取数据进行分析和处理,下面:本文主要介绍python连接本地SQLserver的相关资料,文中通过代码... 目录一.设置本地账号1.新建用户2.开启双重验证3,开启TCP/IP本地服务二js.python连接实例1.

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(