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

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

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

java如何通过Kerberos认证方式连接hive

《java如何通过Kerberos认证方式连接hive》该文主要介绍了如何在数据源管理功能中适配不同数据源(如MySQL、PostgreSQL和Hive),特别是如何在SpringBoot3框架下通过... 目录Java实现Kerberos认证主要方法依赖示例续期连接hive遇到的问题分析解决方式扩展思考总

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

oracle如何连接登陆SYS账号

《oracle如何连接登陆SYS账号》在Navicat12中连接Oracle11g的SYS用户时,如果设置了新密码但连接失败,可能是因为需要以SYSDBA或SYSOPER角色连接,解决方法是确保在连接... 目录oracle连接登陆NmOtMSYS账号工具问题解决SYS用户总结oracle连接登陆SYS账号

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学