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

概述

最近思考激活函数的时候,突然想到神经网络中残差连接是不是和函数的泰勒展开很像,尤其是在激活函数 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.mzph.cn/web/32742.shtml

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

相关文章

VC++支持断点续下或续传的功能

VC使用多线程和Socket实现断点续下 一、断点续下的基本原理&#xff1a; 1.断点续传的理解可以分为两部分&#xff1a;一部分是断点&#xff0c;一部分是续传。断点的由来是在下载过程中&#xff0c;将一个下载文件分成了多个部分&#xff0c;同时进行多个部分一起的下载&…

Adaboost集成学习 | Adaboost集成学习特征重要性分析(Python)

目录 效果一览基本介绍模型设计程序设计参考资料效果一览 基本介绍 Adaboost集成学习特征重要性分析(Python)Adaboost(自适应增强)是一种常用的集成学习方法,用于提高机器学习算法的准确性。它通过组合多个弱分类器来构建一个强分类器。在Adaboost中,每个弱分类器都被赋予…

基于LangChain框架搭建知识库

基于LangChain框架搭建知识库 说明流程1.数据加载2.数据清洗3.数据切分4.获取向量5.向量库保存到本地6.向量搜索7.汇总调用 说明 本文使用openai提供的embedding模型作为框架基础模型&#xff0c;知识库的搭建目的就是为了让大模型减少幻觉出现&#xff0c;实现起来也很简单&a…

Ocam:高效录屏,屏幕录制最佳?

名人说&#xff1a;&#xff1a;一点浩然气&#xff0c;千里快哉风。 ——苏轼 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、Ocam2、核心特点 二、下载安装1、下载2、安装 三、使用方法 很高兴你…

【5】apollo编写python节点步骤及实例

在workspace/modules下新建包buildtool create --template component modules/test_one 编译包 buildtool build -p modules/test_two/ 增加自己的proto消息 在刚才自动生成的proto文件里面添加自己定义的消息,记得重新编译. syntax "proto2";package apollo;…

【python】美妆类商品跨境电商数据分析(源码+课程论文+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

使用RedisShake迁移自建Redis数据至阿里云Redis

一、前言 最近有个需求&#xff0c;需要把自建的Redis数据迁移至阿里云的Redis RDS。阿里云有官方的数据传输服务DTS&#xff08;Data Transmission Service&#xff09;。全量迁移是免费的&#xff0c;但增量迁移需要按量收费&#xff0c;遂放弃。经过一番搜索&#xff0c;发…

数据库的概念-数据库、数据库管理系统、数据库系统、数据库管理员、数据库设计人员、开发管理使用数据库系统的人员

一、数据库&#xff08;DB&#xff09; 1、数据库就是存储数据的仓库&#xff0c;只不过这个仓库是在计算机存储设备上 2、严格的说&#xff0c;数据库是长期存储在计算机内、有组织的、统一管理的、可共享的相关数据的集合 3、数据库应是为一个特定目标而设计、构建并装入数…

ClickHouse备份方案

ClickHouse备份方案主要包括以下几种方法&#xff1a; 一、使用clickhouse-backup工具&#xff1a; &#xff08;参考地址&#xff1a;https://blog.csdn.net/qq_43510111/article/details/136570850&#xff09; **安装与配置&#xff1a;**首先从GitHub获取clickhouse-bac…

利用MSSQL模拟提权

点击星标&#xff0c;即时接收最新推文 本文选自《内网安全攻防&#xff1a;红队之路》 扫描二维码五折购书 利用MSSQL模拟提权 在MS SQL数据库&#xff0c;可以使用EXECUTE AS语句&#xff0c;以其他用户的上下文执行SQL查询。需要注意的是只有明确授予模拟&#xff08;Impers…

38.MessageToMessageCodec线程安全可被共享Handler

handler被注解@Sharable修饰的。 这样的handler,创建一个实例就够了。例如: ByteToMessageCodec的子类不能被@Sharable修饰 如果自定义类是MessageToMessageCodec的子类就是线程共享的,可以被@Sharable修饰的 package com.xkj.protocol;import com.xkj.message.Message; i…

Go日常分享 - error类型是指针类型吗?

背景 这个问题的产生来源于小泉在开发rpc接口时返回error遇到的问题&#xff0c;开发时想在defer里对err进行最终的统一处理赋值&#xff0c;发现外层接收一直都未生效。问题可以简化为成下面的小demo。 func returnError() error {var err errordefer func() {//err errors…

在 Oracle Linux 8.9 上安装中文和日文字体的完整指南

在 Oracle Linux 8.9 上安装中文和日文字体的完整指南 在 Oracle Linux 8.9 上安装中文和日文字体的完整指南前提条件安装步骤1. 更新系统2. 安装字体包安装中文字体安装日文字体 3. 安装字体配置工具4. 更新字体缓存5. 验证安装 可能遇到的问题及解决方案结语 在 Oracle Linux…

(一)SvelteKit教程:hello world

&#xff08;一&#xff09;SvelteKit教程&#xff1a;hello world sveltekit 的官方教程&#xff0c;在这里&#xff1a;Creating a project • Docs • SvelteKitCreating a project • Docs • SvelteKit 我们可以按照如下的步骤来创建一个项目&#xff1a; npm create s…

CentOs7 安装单机版redis

1.安装依赖 redis是由C语言开发&#xff0c;因此安装之前必须要确保服务器已经安装了gcc&#xff0c;可以通过如下命令查看机器是否安装&#xff1a; gcc -v如果没有安装则通过以下命令安装&#xff1a; yum install -y gcc如果安装gcc依赖报错则执行yum升级命令 # 先执行升…

NSIS 入门教程 (三)

引言 在教程的第二部分中&#xff0c;我们为安装程序增加了一个卸载程序&#xff0c;并查看了一些其他的向导页面以及安装部分的选择。第三部分的目标是使安装程序的外观更加现代化。 更现代的外观 为了给安装程序一个更现代的外观&#xff0c;我们要启用现代用户界面。要提…

Shell编辑之条件语句

一&#xff0c;条件测试操作 1&#xff1a;文件测试 文件测试操作用来检查文件的各种属性&#xff0c;如文件是否存在、是否可读、是否为空等。常用的文件测试操作符包括&#xff1a; -e 文件存在性测试-f 是否为普通文件-d 是否为目录-r 是否可读-w 是否可写-x 是否可执行-s…

学懂C#编程:常用高级技术——委托(Delegate)的概念及详细使用讲解

目录 委托的概念 常用应用场景 优势 C#中的委托&#xff08;Delegate&#xff09;是一种引用类型&#xff0c;它允许你封装一个方法的引用。委托类似于函数指针&#xff0c;但提供了更强大和类型安全的功能。委托在C#中扮演着多重角色&#xff0c;常用于实现回调方法、事件…

【栈和队列】

目录 1&#xff0c;栈&#xff08;Stack&#xff09; 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1.5 概念区分 1.6 使用链表来实现栈 2&#xff0c; 队列(Queue) 2.1 概念 2.2 队列的使用 2.3 队列模拟实现 3&#xff0c;双端队列 (Deque) 4&…

【计算机组成原理】部分题目汇总

计算机组成原理 部分题目汇总 一. 简答题 RISC和CICS 简要说明&#xff0c;比较异同 RISC&#xff08;精简指令集&#xff09;注重简单快速的指令执行&#xff0c;使用少量通用寄存器&#xff0c;固定长度指令&#xff0c;优化硬件性能&#xff0c;依赖软件&#xff08;如编译…