BP神经网络反向传播原理【数学原理、举例说明】

反向传播的基本原理

    • 基本概念
    • 什么是链式法则?
    • 反向传播的过程
    • 反向传播步骤
    • 举例:具体计算梯度
      • 1. 前向传播:
      • 2. 计算损失:
      • 3. 反向传播:
    • 为什么梯度的方向是函数值增加最快的方向?
      • 1. 梯度的直观理解
      • 2. 梯度的定义
      • 3. 具体的例子
      • 4. 在点 (1, 1) 处的梯度
      • 5. 梯度的几何解释
      • 6. 数学证明
      • 7. 反向传播和梯度的关系

反向传播(Backpropagation, BP)是一种用于训练神经网络的技术。它通过链式法则计算损失函数相对于每个参数的梯度,从而进行参数更新。

基本概念

反向传播是一种优化算法,用于通过计算梯度来最小化神经网络的损失函数。反向传播的核心思想是使用链式法则来计算损失函数相对于每个网络参数的梯度,从而更新参数以减少损失。

什么是链式法则?

链式法则(Chain Rule)是微积分中的一个重要法则,用于计算复合函数的导数。它告诉我们,如果一个函数 f f f 可以表示为另一个函数 g g g 的复合,即 f ( g ( x ) ) f(g(x)) f(g(x)) ,那么 f f f x x x 的导数可以分解为 f f f g g g 的导数乘以 g g g x x x 的导数。

数学上,链式法则可以表示为:
d d x f ( g ( x ) ) = f ′ ( g ( x ) ) ⋅ g ′ ( x ) \frac{d}{dx} f(g(x)) = f'(g(x)) \cdot g'(x) dxdf(g(x))=f(g(x))g(x)

反向传播的过程

假设我们有一个简单的两层神经网络:

  1. 输入层: x x x
  2. 隐藏层: h = f ( W x + b ) h = f(Wx + b) h=f(Wx+b) ,其中 W W W 是权重矩阵, b b b 是偏置, f f f 是激活函数。
  3. 输出层: y ^ = g ( V h + c ) \hat{y} = g(Vh + c) y^=g(Vh+c) ,其中 V V V 是权重矩阵, c c c 是偏置, g g g 是激活函数。

目标是通过最小化损失函数 L ( y ^ , y ) L(\hat{y}, y) L(y^,y) 来训练网络,其中 y y y 是真实标签。

反向传播步骤

  1. 前向传播(Forward Propagation):

    • 计算隐藏层输出: h = f ( W x + b ) h = f(Wx + b) h=f(Wx+b)
    • 计算最终输出: y ^ = g ( V h + c ) \hat{y} = g(Vh + c) y^=g(Vh+c)
  2. 计算损失(Loss Calculation):

    • 损失函数: L ( y ^ , y ) L(\hat{y}, y) L(y^,y)
  3. 反向传播(Backward Propagation):

    • 目标:计算损失函数 L L L 相对于所有参数 W , b , V , c W, b, V, c W,b,V,c 的梯度。

举例:具体计算梯度

假设激活函数 f f f g g g 都是简单的线性函数(即 f ( x ) = x f(x) = x f(x)=x g ( x ) = x g(x) = x g(x)=x ),损失函数为均方误差(MSE):

L ( y ^ , y ) = 1 2 ( y ^ − y ) 2 L(\hat{y}, y) = \frac{1}{2} (\hat{y} - y)^2 L(y^,y)=21(y^y)2

1. 前向传播:

h = W x + b h = Wx + b h=Wx+b
y ^ = V h + c \hat{y} = Vh + c y^=Vh+c

2. 计算损失:

L ( y ^ , y ) = 1 2 ( y ^ − y ) 2 L(\hat{y}, y) = \frac{1}{2} (\hat{y} - y)^2 L(y^,y)=21(y^y)2

3. 反向传播:

为什么要求导?

求导(计算梯度)是为了直到损失函数L对每个参数的敏感度。具体来说,梯度告诉我们如果稍微调整一个参数 θ \theta θ,损失L会如何变化。

通过知道这个变化的方向和大小,我们可以调整参数,使得损失函数变小,这也就是优化模型的过程。

对于神经网络来说,输出层的梯度计算是反向传播的起点,因为输出层直接影响损失函数。我们需要知道损失函数对输出层输出的影响,以便逐层传播回去,调整每一层的参数

Step 1: 计算输出层的梯度

对输出层的输出 y ^ \hat{y} y^ 求导:

∂ L ∂ y ^ = y ^ − y \frac{\partial L}{\partial \hat{y}} = \hat{y} - y y^L=y^y

V V V c c c 求导:

∂ L ∂ V = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ V = ( y ^ − y ) ⋅ h \frac{\partial L}{\partial V} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial V} = (\hat{y} - y) \cdot h VL=y^LVy^=(y^y)h

∂ L ∂ c = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ c = ( y ^ − y ) ⋅ 1 = ( y ^ − y ) \frac{\partial L}{\partial c} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial c} = (\hat{y} - y) \cdot 1 = (\hat{y} - y) cL=y^Lcy^=(y^y)1=(y^y)

Step 2: 计算隐藏层的梯度

对隐藏层的输出 ( h ) 求导:

∂ L ∂ h = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ h = ( y ^ − y ) ⋅ V \frac{\partial L}{\partial h} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial h} = (\hat{y} - y) \cdot V hL=y^Lhy^=(y^y)V

W W W b b b 求导:

∂ L ∂ W = ∂ L ∂ h ⋅ ∂ h ∂ W = ( ( y ^ − y ) ⋅ V ) ⋅ x \frac{\partial L}{\partial W} = \frac{\partial L}{\partial h} \cdot \frac{\partial h}{\partial W} = ((\hat{y} - y) \cdot V) \cdot x WL=hLWh=((y^y)V)x

∂ L ∂ b = ∂ L ∂ h ⋅ ∂ h ∂ b = ( y ^ − y ) ⋅ V \frac{\partial L}{\partial b} = \frac{\partial L}{\partial h} \cdot \frac{\partial h}{\partial b} = (\hat{y} - y) \cdot V bL=hLbh=(y^y)V

更新参数:

使用梯度下降法更新参数:

W ← W − η ∂ L ∂ W W \leftarrow W - \eta \frac{\partial L}{\partial W} WWηWL
b ← b − η ∂ L ∂ b b \leftarrow b - \eta \frac{\partial L}{\partial b} bbηbL
V ← V − η ∂ L ∂ V V \leftarrow V - \eta \frac{\partial L}{\partial V} VVηVL
c ← c − η ∂ L ∂ c c \leftarrow c - \eta \frac{\partial L}{\partial c} ccηcL

其中, η \eta η 是学习率。

为什么可以使用梯度下降法更新?原理是什么?

梯度下降法是一种优化算法,用于最小化目标函数(在这里是损失函数)。它的基本思想是 沿着目标函数梯度的负方向更新参数 ,因为梯度指示了函数增大的最快方向,而我们希望减少损失函数的值。
具体来说,梯度下降法的更新规则是:
θ ← θ − η ∂ L ∂ θ \theta \leftarrow \theta - \eta \frac{\partial L}{\partial \theta} θθηθL
其中:

  • θ \theta θ 是需要更新的参数
  • η \eta η 是学习率,控制每次更新的步长
  • ∂ L ∂ θ \frac{\partial L}{\partial \theta} θL 是损失函数对参数 θ \theta θ 的梯度

梯度下降法的原理基于以下几点:

  1. 梯度的方向性:梯度指示了函数增大的方向。为了最小化损失函数,我们沿着梯度的负方向更新参数。
  2. 迭代更新:通过多次迭代更新参数,逐步逼近损失函数的局部最小值。
  3. 学习率控制:学习率决定了每次更新的步长。如果步长太大,可能会错过最优点;如果步长太小,收敛速度会很慢。

通过反向传播计算出每个参数的梯度后,我们使用梯度下降法来更新这些参数,使得损失函数逐步减小,从而训练出一个性能更好的模型。

如何理解“梯度指示了函数增大的方向”?

梯度是函数在某一点的导数向量,表示该点在各个方向上的 变化率 。在一个多维空间中, 梯度向量的方向指向函数值增长最快的方向 。我们来举个简单的二维例子来帮助理解。

假设我们有一个二维函数 f ( x , y ) f(x, y) f(x,y) ,在某个点 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) ,函数值为 f ( x 0 , y 0 ) f(x_0, y_0) f(x0,y0) 。如果我们在该点计算梯度 ∇ f ( x 0 , y 0 ) \nabla f(x_0, y_0) f(x0,y0) ,得到的梯度向量可能是 ( ∂ f / ∂ x , ∂ f / ∂ y ) (\partial f / \partial x, \partial f / \partial y) (f/x,f/y)

这个梯度向量表示在 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 点,函数 f f f x x x y y y 方向上的变化率。梯度的方向就是函数值增加最快的方向,即如果我们沿着梯度的方向移动,函数值会迅速增大。

为了最小化函数值,我们需要沿着梯度的反方向(即梯度的负方向)移动,因为这会使函数值减小。这就是梯度下降法的基本原理。

为什么梯度的方向是函数值增加最快的方向?

1. 梯度的直观理解

我们先从二维空间中的一个简单例子开始,假设我们有一个函数 f ( x , y ) f(x, y) f(x,y) ,其图像是一个地形图,表示一个山的高度。梯度 ∇ f ( x , y ) \nabla f(x, y) f(x,y) 在某点 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 处的方向和大小,表示在该点处函数值变化最快的方向和变化的速度。

2. 梯度的定义

在多维空间中,函数 f f f 的梯度 ∇ f \nabla f f 是一个向量,其每个分量是函数在该方向上的偏导数

∇ f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , … , ∂ f ∂ x n ) \nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n} \right) f=(x1f,x2f,,xnf)

这个向量在点 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 处的方向,就是 函数值增加最快的方向

3. 具体的例子

考虑一个简单的函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 ,其梯度是:

∇ f ( x , y ) = ( ∂ f ∂ x , ∂ f ∂ y ) = ( 2 x , 2 y ) \nabla f(x, y) = \left( \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right) = (2x, 2y) f(x,y)=(xf,yf)=(2x,2y)

4. 在点 (1, 1) 处的梯度

假设我们在点 ( (1, 1) ) 处,那么梯度就是:

∇ f ( 1 , 1 ) = ( 2 ⋅ 1 , 2 ⋅ 1 ) = ( 2 , 2 ) \nabla f(1, 1) = (2 \cdot 1, 2 \cdot 1) = (2, 2) f(1,1)=(21,21)=(2,2)

这个梯度向量 ( 2 , 2 ) (2, 2) (2,2) 指向坐标轴的第一个象限,并且指示了函数 f ( x , y ) f(x, y) f(x,y) 在这个点处增加最快的方向。

5. 梯度的几何解释

如果我们在点 ( 1 , 1 ) (1, 1) (1,1) 沿着梯度方向 ( 2 , 2 ) (2, 2) (2,2) 移动,函数值会迅速增加。具体来说,如果我们沿着梯度的方向小步移动 Δ s \Delta s Δs ,新点的坐标为 ( 1 + Δ s ⋅ 2 , 1 + Δ s ⋅ 2 ) (1 + \Delta s \cdot 2, 1 + \Delta s \cdot 2) (1+Δs2,1+Δs2)

6. 数学证明

要证明梯度是函数值增加最快的方向,可以从以下角度考虑:

我们在 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 点沿着一个单位向量 u \mathbf{u} u 的方向移动一小步 Δ s \Delta s Δs ,那么函数值的变化量为:

Δ f = f ( x 0 + Δ s ⋅ u x , y 0 + Δ s ⋅ u y ) − f ( x 0 , y 0 ) \Delta f = f(x_0 + \Delta s \cdot u_x, y_0 + \Delta s \cdot u_y) - f(x_0, y_0) Δf=f(x0+Δsux,y0+Δsuy)f(x0,y0)

( x 0 , y 0 ) (x_0, y_0) (x0,y0) 点附近,我们可以使用泰勒展开来近似表示函数 f ( x , y ) f(x, y) f(x,y) 的变化。泰勒展开的一阶近似形式为:

f ( x 0 + Δ x , y 0 + Δ y ) ≈ f ( x 0 , y 0 ) + ∂ f ∂ x Δ x + ∂ f ∂ y Δ y f(x_0 + \Delta x, y_0 + \Delta y) \approx f(x_0, y_0) + \frac{\partial f}{\partial x} \Delta x + \frac{\partial f}{\partial y} \Delta y f(x0+Δx,y0+Δy)f(x0,y0)+xfΔx+yfΔy

泰勒展开是一种用于近似表示函数在某点附近的值的方法。它将一个函数表示为无穷阶导数的级数。泰勒展开的一阶近似形式如下:
f ( x 0 + Δ x ) ≈ f ( x 0 ) + d f d x ( x 0 ) Δ x f(x_0 + \Delta x) \approx f(x_0) + \frac{df}{dx}(x_0) \Delta x f(x0+Δx)f(x0)+dxdf(x0)Δx

其中, f ( x 0 ) f(x_0) f(x0) 是函数 f ( x ) f(x) f(x) 在点 x 0 x_0 x0 处的值, d f d x ( x 0 ) \frac{df}{dx}(x_0) dxdf(x0) 是函数 f ( x ) f(x) f(x) 在点 x 0 x_0 x0 处的导数。

对于二元函数 f ( x , y ) f(x, y) f(x,y),泰勒展开可以表示为:
f ( x 0 + Δ x , y 0 + Δ y ) ≈ f ( x 0 , y 0 ) + ∂ f ∂ x ( x 0 , y 0 ) Δ x + ∂ f ∂ y ( x 0 , y 0 ) Δ y f(x_0 + \Delta x, y_0 + \Delta y) \approx f(x_0, y_0) + \frac{\partial f}{\partial x}(x_0, y_0) \Delta x + \frac{\partial f}{\partial y}(x_0, y_0) \Delta y f(x0+Δx,y0+Δy)f(x0,y0)+xf(x0,y0)Δx+yf(x0,y0)Δy
这里, ∂ f ∂ x ( x 0 , y 0 ) \frac{\partial f}{\partial x}(x_0, y_0) xf(x0,y0) ∂ f ∂ y ( x 0 , y 0 ) \frac{\partial f}{\partial y}(x_0, y_0) yf(x0,y0) 分别表示函数 f ( x , y ) f(x, y) f(x,y) 在点 ( x 0 , y 0 ) (x_0, y_0) (x0,y0) 处的偏导数。

对于给定的步长 Δ x \Delta x Δx Δ y \Delta y Δy ,可以使用泰勒展开来近似计算函数值的变化 Δ f \Delta f Δf

Δ x = Δ s ⋅ u x \Delta x = \Delta s \cdot u_x Δx=Δsux Δ y = Δ s ⋅ u y \Delta y = \Delta s \cdot u_y Δy=Δsuy 代入上式,得到:

f ( x 0 + Δ s ⋅ u x , y 0 + Δ s ⋅ u y ) ≈ f ( x 0 , y 0 ) + ∂ f ∂ x ( Δ s ⋅ u x ) + ∂ f ∂ y ( Δ s ⋅ u y ) f(x_0 + \Delta s \cdot u_x, y_0 + \Delta s \cdot u_y) \approx f(x_0, y_0) + \frac{\partial f}{\partial x} (\Delta s \cdot u_x) + \frac{\partial f}{\partial y} (\Delta s \cdot u_y) f(x0+Δsux,y0+Δsuy)f(x0,y0)+xf(Δsux)+yf(Δsuy)

进一步整理可得:

f ( x 0 + Δ s ⋅ u x , y 0 + Δ s ⋅ u y ) ≈ f ( x 0 , y 0 ) + ∂ f ∂ x u x Δ s + ∂ f ∂ y u y Δ s f(x_0 + \Delta s \cdot u_x, y_0 + \Delta s \cdot u_y) \approx f(x_0, y_0) + \frac{\partial f}{\partial x} u_x \Delta s + \frac{\partial f}{\partial y} u_y \Delta s f(x0+Δsux,y0+Δsuy)f(x0,y0)+xfuxΔs+yfuyΔs

由于 ∇ f = ( ∂ f ∂ x , ∂ f ∂ y ) \nabla f = \left( \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y} \right) f=(xf,yf) ,可以将上式改写为:

f ( x 0 + Δ s ⋅ u x , y 0 + Δ s ⋅ u y ) ≈ f ( x 0 , y 0 ) + ∇ f ⋅ u ⋅ Δ s f(x_0 + \Delta s \cdot u_x, y_0 + \Delta s \cdot u_y) \approx f(x_0, y_0) + \nabla f \cdot \mathbf{u} \cdot \Delta s f(x0+Δsux,y0+Δsuy)f(x0,y0)+fuΔs

为了最大化 Δ f \Delta f Δf ,我们需要最大化 ∇ f ( x 0 , y 0 ) ⋅ u \nabla f(x_0, y_0) \cdot \mathbf{u} f(x0,y0)u 。由于 u \mathbf{u} u 是单位向量,其模为1,最大化点积意味着 u \mathbf{u} u 必须与 ∇ f ( x 0 , y 0 ) \nabla f(x_0, y_0) f(x0,y0) 同向。因此,梯度的方向就是函数值增加最快的方向。

7. 反向传播和梯度的关系

在反向传播中,我们利用梯度信息来更新模型的参数。通过计算损失函数相对于每个参数的梯度,我们知道每个参数变化的方向和大小,从而调整参数使损失函数减小。具体步骤如下:

  1. 计算损失函数的梯度:反向传播计算每个参数的梯度。
  2. 沿梯度的反方向更新参数:为了最小化损失函数,我们沿梯度的反方向移动参数。

这样,我们就逐步调整模型,使其性能越来越好。

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

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

相关文章

C语言学习笔记之结构篇

C语言是一门结构化程序设计语言。在C语言看来,现实生活中的任何事情都可看作是三大结构或者三大结构的组合的抽象,即顺序,分支(选择),循环。 所谓顺序就是一条路走到黑;生活中在很多事情上我们都…

寒冬来了,字节跳动开启裁员新模式。。

大家好,我是白露啊。 不得不说,字节跳动还是真的会搞事啊。 最近一段时间,字节搞出了一个裁员新模式:“细水长流”。这个寓意和“财(裁)源(员)广进”计划差不多了,只不…

python如何巧妙地利用内置函数与列表切片组织舞会派对

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言 二、问题分析 三、解决方案 1. 利用内置函数创建参会人员名单 2. 利用列表切片…

【Spring】使用 @Schedule 完成定时任务

在Spring框架中&#xff0c;使用Spring Schedule可以很方便地创建定时任务。以下是一个使用Spring Schedule完成定时任务的DEMO&#xff1a; 引入Spring Boot依赖&#xff1a;在pom.xml文件中添加Spring Boot Starter依赖&#xff0c;这会自动包含Spring Scheduling。 <de…

Redis 事件机制 - AE 抽象层

Redis 服务器是一个事件驱动程序&#xff0c;它主要处理如下两种事件&#xff1a; 文件事件&#xff1a;利用 I/O 复用机制&#xff0c;监听 Socket 等文件描述符上发生的事件。这类事件主要由客户端&#xff08;或其他Redis 服务器&#xff09;发送网络请求触发。时间事件&am…

YashanDB携手慧点科技完成产品兼容认证 助力国产信创生态建设

近日&#xff0c;深圳计算科学研究院崖山数据库系统YashanDB与慧点科技顺利完成兼容性互认证。经严格测试&#xff0c;双方产品完全兼容&#xff0c;稳定运行&#xff0c;共同支撑政府、企业、金融等办公应用场景下的数字化转型升级&#xff0c;为企业的信息技术应用创新提供坚…

Flutter 中的 CupertinoScrollbar 小部件:全面指南

Flutter 中的 CupertinoScrollbar 小部件&#xff1a;全面指南 在Flutter中&#xff0c;CupertinoScrollbar是Cupertino组件库中的一个widget&#xff0c;它提供了一个具有iOS风格的滚动条&#xff0c;用于增强滚动体验。与标准的Scrollbar类似&#xff0c;CupertinoScrollbar…

【计算机视觉(4)】

基于Python的OpenCV基础入门——色彩空间转换 色彩空间简介HSV色彩空间GRAY色彩空间色彩空间转换 色彩空间转换代码实现: 色彩空间简介 色彩空间是人们为了表示不同频率的光线的色彩而建立的多种色彩模型。常见的色彩空间有RGB、HSV、HIS、YCrCb、YUV、GRAY&#xff0c;其中最…

sql日期函数统计日月年订单数

场景:汇集日月年的订单数,分别在mysql和oracle数据库实现相同的效果 示例1: --创建mysql测试表 drop table test.test; create table test.test ( id bigint(20) NOT NULL AUTO_INCREMENT, name varchar(50) DEFAULT NULL COMMENT 名称, c_date date , PRIMARY KEY (id) ) C…

基于Matlab的车道线检测系统 (文末有代码获取链接)【含Matlab源码 MX_001期】

运行环境&#xff1a;Matlab2014b 部分代码&#xff1a; %% 视频流循环处理 % 创建一个循环过程来对给定视频进行车道线检测 % 该循环使用之前初始化的系统对象 warningTextColors {[1 0 0], [1 0 0], [0 0 0], [0 0 0]}; while ~isDone(hVideoSrc) RGB step(hVideoSrc);% …

SpringBoot使用redis结合mysql数据库(黑名单)渲染商品详情界面

目录 一、界面效果 二、前端代码 三、后端代码&#xff08;redisblacklist&#xff09; 3.1 ProducatController 3.2 ProductService 3.3 ProductDao 3.4 映射文件 一、界面效果 二、前端代码 商品详情前端代码 <template><van-nav-bartitle"商品详情&quo…

【FixBug】超级大Json转POJO失败

今天遇到了一个问题&#xff1a;使用Jackson将一个超级大的JSON字符串转换POJO失败&#xff0c;debug看没问题&#xff0c;将JSON字符串粘贴到main方法中测试&#xff0c;提示错误信息如下&#xff1a; 自己猜测是因为字符串超长导致转换时先截断字符串导致JSON格式不正确&…

微服务架构-分支微服务设计模式

微服务架构-分支微服务设计模式 这种模式是聚合器模式的扩展&#xff0c;允许同时调用两个微服务链 分支微服务设计模式是一种用于构建大型系统的微服务架构模式&#xff0c;其核心思想是 将复杂的业务逻辑拆解为多个小的、相互独立的子系统&#xff0c;每个子系统由一个或多…

unity制作app(10)--统一字体

1.载入字体&#xff0c;微软雅黑&#xff0c;需要3分钟左右 加载进来3个 2.font文件夹下创建一个txt&#xff0c;内部的内容如下&#xff1a; &#xfeff;啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏…

C# 语法糖

语法糖 var关键字&#xff08;隐式类型变量&#xff09;&#xff1a;自动属性&#xff1a;简化的事件访问器&#xff1a;Lambda表达式和匿名方法&#xff1a;扩展方法&#xff1a;LINQ查询&#xff1a;异步编程&#xff08;async和await&#xff09;&#xff1a;嵌套匿名类型&a…

word如何创造新的格式标题

1 效果如下&#xff1a;&#xff08;标题命名默认音序排序&#xff09; 2 创建 选中自己喜欢的标题&#xff0c;修改字号字体&#xff0c;then 3 修改 注意要点如下&#xff1a; 后续&#xff1a;以上操作可能导致后续一级标题不能折叠二级标题&#xff0c;目录导航栏也不能…

C++网络编程——socket

在服务器中&#xff0c;需要建立一个socket套接字才能对外提供一个网络通信接口&#xff0c;在Linux系统中套接字仅是一个文件描述符&#xff0c;也就是一个int类型的值 socket概念 socket 的原意是“插座”&#xff0c;在计算机通信领域&#xff0c;socket 被翻译为“套接字…

OpenStack创建云主机——超级详细步骤

四、创建云主机 一台云主机成功创建或启动需要依赖OpenStack中的各种虚拟资源&#xff0c;如CPU、内存、硬盘等。如果需要云主机丽娜姐外部网络&#xff0c;还需要网络、路由器等资源。如果需要外部网络访问云主机&#xff0c;那么还需要配置浮动IP。因此&#xff0c;在创建云主…

开源监控工具monit安装部署

Monit 简介 Monit是一个轻量级(500KB)跨平台的用来监控Unix/linux系统的开源工具。部署简单&#xff0c;并且不依赖任何第三方程序、插件或者库。 Monit可以监控服务器进程、文件、文件系统、网络状态&#xff08;HTTP/SMTP等协议&#xff09;、远程主机、服务器资源变化等等。…

Linux内核 -- 启用 Linux 内核调试信息

启用 Linux 内核调试信息 本文档提供了如何在编译 Linux 内核时启用调试信息的逐步指南。调试信息对于调试和诊断内核问题至关重要。 启用调试信息的步骤 1. 进入内核源代码目录 打开终端并导航到 Linux 内核源代码目录&#xff1a; cd /path/to/linux-kernel2. 配置内核 …