当前位置: 首页 > news >正文

【机器学习chp13--(上)】人工神经网络(MLP结构 + KAN结构 + 卷积神经网络)

目录

一、神经元结构

1、生物神经元

2、人工神经元(MLP结构)

3、激活函数

(1)激活函数的基本特性

(2)常见的激活函数

1. Sigmoid 函数

2. Tanh 函数

3. ReLU (Rectified Linear Unit) 函数

4. ReLU的变种

(3)激活函数的选择

(4)激活函数的综合比较

4、另一种人工神经元结构(KAN)

(1)KAN的理论基础

(2)KAN的结构

(3)KAN的优势

(4)KAN的参数设计

(5)KAN的激活函数设计

(6)KAN的优势与应用

(7)与多层感知机(MLP)的对比

二、全连接前馈神经网络

1、网络结构 和 符号体系

2、模型训练:反向传播

(1)目标函数

(2)梯度下降

(3)反向传播

3.1 输出层的误差项:

3.2 计算隐藏层的梯度

(4)权重更新

(5)梯度消失和梯度爆炸

三、为什么要有深度模型

1、两类模型比较

2、瘦高模型表达能力更强的解释

(1)分层组合与层次结构

(2)参数利用率与“指数”优势

(3)局部特征的逐层抽象

(4)理论支持

四、卷积神将网络

1、对图像为什么要用卷积网络

(1)局部感受野与局部连接

(2)参数共享与降低模型复杂度

(3)平移不变性(Translation Invariance)

(4)层次特征提取

(5)池化层的作用

(6)总结

2、卷积层

(1)核心特点(也是卷积神经网络相比于全连接神经网络的特点)

(2)边缘填充

(3)多输入通道

(4)一维卷积和三维卷积

(5)更多的花式卷积

5.1 大小为1×1的卷积核

5.2 不同尺寸卷积核:inception v2

5.3 空洞卷积

5.4 可变形卷积核

5.5 分组卷积

5.6 深度可分离卷积

5.7 通道洗牌

3、池化层

4、卷积网络的模型训练

(1)卷积层的训练

(2)池化层的训练

2.1池化层反向传播的核心思想

2.2 池化层的反向传播:

2.3 梯度的传播:

2.4 池化层反向传播中的特殊注意事项:

附录

1、贝塞尔曲线 与 B样条

(1)Langrange插值

(2)样条曲线 和 贝塞尔曲线

i、样条曲线:

ii、贝塞尔曲线:

iii、贝塞尔曲线的递推公式

iv、贝塞尔曲线的性质与特点

(3)B样条

i、基本概念

ii、数学定义与构成要素

iii、主要性质


一、神经元结构

1、生物神经元

神经细胞之间通过突触连接,突触通过复杂精巧的电化学过程传递信息。接收前面神经元的输入,汇总\rightarrow决策\rightarrow传递。

                         

2、人工神经元(MLP结构)

                  

输入:向量 \mathbf{x} = [x_1, x_2, ..., x_D],其中 D 是输入的维度。这些输入可以来自传感器或其他神经元的输出,它们代表了神经元接收到的信息或特征。

权重和偏置:每个输入信号 x_j​ 都有一个对应的权重 w_j​,这表示输入信号在神经元输出中的重要程度。权重向量 \mathbf{w} = [w_1, w_2, ..., w_D] 控制了每个输入信号对输出的影响。 此外,还有一个偏置 bbb,它是一个常数值,用来调整神经元的激活阈值。偏置的作用是确保模型的灵活性。

加权求和(加法器):所有输入信号 x_j​ 与相应的权重 w_j​ 相乘后求和,得到一个线性组合:

                                             z = \sum_{j=1}^{D} w_j x_j + b = \mathbf{w}^T \mathbf{x} + b

这个结果 z 是输入信号经过加权和偏置调整后的总和。

激活函数(激活层):计算得到的加权和 z 会输入到激活函数中。激活函数 \sigma(z) 用于引入非线性,使神经元能够学习到更复杂的映射关系。常见的激活函数包括Sigmoid、ReLU、Tanh等。在该图中,激活函数通过符号 \sigma 来表示。经过激活函数处理后,输出 a 可以表示为:

                                                                   a = \sigma(z)

这个输出 a 是神经元的最终输出,它可以被传递到下一层神经元或作为模型的最终预测结果。

输出:神经元的输出 a 将传递给下游神经元或最终用于分类或回归任务。通常,输出值 a 会根据实际任务的需求进行解释或处理。

3、激活函数

(1)激活函数的基本特性

  • 连续并可导的非线性函数:一个合适的激活函数需要具备连续并且在其大部分区域可导的性质。这样才能确保在使用梯度下降法等优化算法时,神经网络能够有效地学习和更新参数。
  • 简单性与效率:激活函数及其导函数应该尽可能简单,以提高网络计算的效率。复杂的激活函数会影响训练速度和模型的稳定性。
  • 导函数的范围控制:导函数的值需要在一个合适的范围内,避免过大或过小,这有助于训练时梯度的稳定性。

(2)常见的激活函数

1. Sigmoid 函数

                        

  • 公式: \sigma(x) = \frac{1}{1 + e^{-x}}
  • 优点:常用于二分类问题的输出层。在早期的神经网络中较为普遍,逐渐被更简单的ReLU函数取代。
  • 缺点
    • 在输入较大的正负值时,梯度几乎为零,容易导致梯度消失问题(vanishing gradient problem)。
    • 输出范围在0到1之间,可能导致网络参数更新缓慢
    • 非零置中心化的输出会使得其后一层的神 经元的输入发生偏偏移(bias shift), 并进一步使得梯度下降的收敛速度变慢。
    • 导数最大值为0.25:反向传播时,返回网络的误差将会在每一层收缩至少75%
2. Tanh 函数

                ​​​​​​​    

  • 公式: \tanh(x) = \frac{1 - e^{-2x}}{1 + e^{-2x}} = 2 Sigmoid(2x) - 1
  • 优点:形状和Sigmoid函数相似,但输出范围是 [-1, 1],相比于Sigmoid可以避免一些偏置问题
  • 缺点:同样会遇到梯度消失的问题,特别是当输入的绝对值较大时。相比于Sigmoid缓解了梯度消失现象。
3. ReLU (Rectified Linear Unit) 函数

        ​​​​​​​           

  • 公式: \text{ReLU}(x) = \max(0, x)
  • 优点
    • 计算效率高,计算量小,因为没有复杂的数学运算,不涉及除法。
    • 解决了梯度消失问题(当 x > 0 时,梯度为1),收敛速度快。
    • 一部分神经元的输出为 0 :网络稀疏, 减少了参数的相互依存关系,缓解过拟合。
  • 缺点
    • x < 0 时,梯度为零,可能导致神经元“死亡”(即在某些情况下无法激活),从而影响模型的学习。
4. ReLU的变种

        ​​​​​​​        ​​​​​​​          

  • Leaky ReLU:当 x < 0 时,输出为 \gamma x (其中 \gamma 是一个小常数),它解决了ReLU函数死神经元问题。
  • PreLU:类似于Leaky ReLU,但它引入了可学习的参数 \gamma,以使得每个神经元的负区域具有自适应的斜率。
  • ELU (Exponential Linear Unit):当 x < 0 时,使用指数函数\gamma (e^x - 1),避免了ReLU的死神经元问题,并能产生更好的训练效果。
  • Softplus 函数:平滑的ReLU函数变种,它为负值提供了一个平滑的过渡,避免了ReLU的硬性零值。

(3)激活函数的选择

  • ReLU:由于其计算速度快且有效,通常是首选激活函数,特别是在深度神经网络中。
  • Leaky ReLU、ELU、MaxOut如果ReLU的效果不佳,可以尝试这些ReLU的变种
  • Tanh:适合在LSTM等序列建模问题中使用。
  • Sigmoid 和 Tanh:这些激活函数适用于RNN(LSTM、注意力机制等)结构中作为门控机制的激活函数,尤其在序列处理和控制模型中非常有用,但在其他网络中逐渐减少使用。

(4)激活函数的综合比较

  • 计算效率:ReLU由于其简洁的计算形式,在计算效率上优于其他复杂的激活函数。
  • 梯度消失问题:Sigmoid和Tanh容易在深层网络中遇到梯度消失问题,ReLU及其变种可以有效避免这一问题。
  • 非零输出中心:Tanh的输出为-1到1之间,解决了Sigmoid函数输出非零中心问题,而ReLU则解决了梯度消失和学习效率的问题。

总体来说,ReLU和其变种因其高效性和相对简单的实现而广泛应用于现代神经网络中。

4、另一种人工神经元结构(KAN)

                                                        MLP结构和KAN结构对比

(1)KAN的理论基础

  • KAN基于Kolmogorov-Arnold定理,该定理表明如果一个函数 f 是多元连续函数,它可以被表示成有限数量的单变换连续函数的两层嵌套组合形式。
  • 公式表示为: f(x) = f(x_1, x_2, ..., x_D) = \sum_{q=1}^{2D+1} \Phi_q \left( \sum_{p=1}^n \phi_{q,p}(x_p) \right) 其中,\Phi_q​ 是外部函数,\phi_{q,p}(x_p) 是内部函数,表示多元输入到网络输出的嵌套结构。

(2)KAN的结构

  • 外部函数 \Phi_q:外部函数是可学习的函数(比如 B样条函数),它们的作用是增强KAN的表示能力。

  • 内部函数 \phi_{q,p}(x_p):这些是与输入 x_p​ 相关的函数,通常是固定的(例如Sigmoid或线性函数),它们通过嵌套运算来处理输入数据。

  • KAN的计算模型:

    • KAN在计算结构上与传统的多层感知机(MLP)有所不同:其节点上的激活函数是固定的,而边上的激活函数则是可学习的。
    • KAN的每个层次都代表一个小型网络,表达了能量关系,更适合处理复杂的非线性映射。

(3)KAN的优势

  • 与传统MLP对比:与传统的MLP网络(例如多层感知机)不同,KAN的模型是通过先变后加的方法来设计的,而不是先加后变(MLP结构)。
  • 细粒度与多样化:KAN在学习过程中能处理更多细节,并通过可训练的内外部函数来实现更复杂的非线性转换。

(4)KAN的参数设计

  • 可学习的激活函数:KAN的边(即每条连接)上的激活函数是可学习的,这意味着激活函数的形状和参数可以通过训练优化,以适应给定任务的需求。
  • 可学习的B样条函数:B样条函数作为KAN的一部分,提供了更加细粒度的调控,并能通过其参数来细化模型的表现。
  • 权重初始化:在KAN中,权重(如 w)会被初始化为适当的值(例如,使用Xavier初始化方法),以确保神经元的非线性转换能够有效训练。

(5)KAN的激活函数设计

  • 内部函数 \phi(x):内部函数设计为 \phi(x) = w(b(x) + \text{spline}(x)),其中:
    • b(x) = \text{slil}(x) = \frac{x}{1 + e^{-x}}=x \times \text{sigmoid}(x)​ 是一种Sigmoid线性单位(SiLU)。
    • \text{spline}(x) 是一个B样条函数,带有可训练的参数 c_{i,k}​ 来控制样条的曲线形状。
  • 训练过程:这些内部函数的参数(如 c_{i,k}​)会在训练过程中进行优化,初始时这些参数是随机的,并且遵循正态分布。

(6)KAN的优势与应用

  • KAN能够实现复杂的非线性映射,适用于对数据有高度要求的任务,如函数逼近和高维数据建模。
  • 由于其模型设计和结构,KAN相对于传统的神经网络模型来说在处理某些特定问题时可能展现出更高的表现力和适应能力,特别是在多层次非线性转换的场景中。
  • 表达能力更强,可用更紧凑的结构来刻画复杂的映射关系。

(7)与多层感知机(MLP)的对比

  • 在传统的多层感知机中,每一层的激活函数通常是固定的(例如Sigmoid或ReLU),而KAN则将激活函数放置在边上,且这些激活函数是可训练的。
  • KAN的模型设计使得它能够表达更加复杂的非线性映射,从而提升其表达能力。

        总结来说,KAN通过将外部可学习激活函数和内部固定激活函数相结合,提供了一种更灵活、更强大的神经网络架构,能够更好地处理复杂的函数逼近任务,并具有比传统MLP更高的灵活性和表达能力。

《有关B样条的介绍见附录1》

二、全连接前馈神经网络

1、网络结构 和 符号体系

输入层:输入数据为 \mathbf{x}=[x_1,x_2,\cdot \cdot \cdot ,x_D] ,其维度为 D \times 1(即有 D 个特征)。 

第一个隐藏层:

        输入层到第一隐藏层,输入 \mathbf{x} 要乘上权重 \mathbf{W}^{(1)}=[W^{1}_{1},W^{1}_{2},\cdot \cdot \cdot W^{1}_{D}]维度为 D \times D ),

        再加上偏置 \mathbf{b}^{(1)}维度为 1 \times 1),

        得到 \mathbf{z}^{(1)}=[z^{1}_{1},z^{1}_{2},\cdot \cdot \cdot z^{1}_{D}]维度为 D \times 1),

        经过非线性变换 \sigma 后得到 第一个隐藏层的输出 \mathbf{a}^{(1)}=[a^{1}_{1},a^{1}_{2},\cdot \cdot \cdot a^{1}_{D}] ,

第二个隐藏层:

        第一隐藏层到第二隐藏层, \mathbf{a}^{(1)} 要乘上权重 \mathbf{W}^{(2)}=[W^{2}_{1},W^{2}_{2},\cdot \cdot \cdot W^{2}_{D}] (维度为 D \times D )

        再加上偏置 \mathbf{b}^{(2)}维度为 1 \times 1),

        得到 \mathbf{z}^{(2)}=[z^{2}_{1},z^{2}_{2},\cdot \cdot \cdot z^{2}_{D}]维度为 D \times 1),

        经过非线性变换 \sigma 后得到 第二个隐藏层的输出 \mathbf{a}^{(2)}=[a^{2}_{1},a^{2}_{2},\cdot \cdot \cdot a^{2}_{D}] ,

. . .

. . .

最后一个隐藏层:

        最后一个隐藏层的输出 \mathbf{a}^{(L)}=[a^{L}_{1},a^{L}_{2},\cdot \cdot \cdot a^{L}_{D}] ,记为 \mathbf{\hat{y}}=[\hat{y}_{1},\hat{y}_{2},\cdot \cdot \cdot \hat{y}_{D}]

        有时候要经过softmax层控制输出的维度。

综合一下:

        \hat{y} = f(x) 

            = \sigma \left( W^{(L)} \dots \sigma \left( W^{(2)} \sigma \left( W^{(1)} x + b^{(1)} \right) + b^{(2)} \right) \dots + b^{(L)} \right)

对符号 \mathbf{W}^{(l)} 的解释:

   \mathbf{W}^{(l)} 是从第 l-1 层到第 l 层的权重矩阵。这个矩阵的维度是 N_l \times N_{l-1}​,其中:

  • N_l​ 是第 l 层的神经元个数。
  • N_{l-1}​ 是第 l-1 层的神经元个数。

   矩阵 \mathbf{W}^{(l)} 的每个元素:

  • 矩阵中的每个元素 W^{(l)}_{i,j} 表示第 l-1 层的第 j 个神经元与第 l 层的第 i 个神经元之间的连接权重。
  • 也就是说,矩阵 W^{(l)} 中的第 i 行、第 j 列的元素表示的是从第 l-1 层的第 j 个神经元传递到第 l 层的第 i 个神经元的权重。

   矩阵结构:

  • 矩阵 \mathbf{W}^{(l)} 的结构可以展开为: 

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        W^{(l)} = \begin{pmatrix} w^{(l)}_{1,1} & w^{(l)}_{1,2} & \dots & w^{(l)}_{1, N_{l-1}} \\ w^{(l)}_{2,1} & w^{(l)}_{2,2} & \dots & w^{(l)}_{2, N_{l-1}} \\ \vdots & \vdots & \ddots & \vdots \\ w^{(l)}_{N_l, 1} & w^{(l)}_{N_l, 2} & \dots & w^{(l)}_{N_l, N_{l-1}} \end{pmatrix}​​​

  • 其中,w^{(l)}_{i,j}​ 代表从第 l-1  层的第 j 个神经元到第 l 层的第 i 个神经元的连接权重。

2、模型训练:反向传播

(1)目标函数

模型参数为:\theta = \{ W^{(1)}, b^{(1)}, W^{(2)}, b^{(2)}, \dots, W^{(L)}, b^{(L)} \} 。

损失函数:损失函数 L(y, \hat{y}) 被定义为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        L(y, \hat{y}) = - \sum_{k=1}^{10} y_k \log(\hat{y}_k)

                这是典型的交叉熵损失函数,用于分类问题。

目标函数:目标函数 J(\theta) 用于寻找最小的网络参数 \theta^*,其表达式为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        J(\theta) = \frac{1}{N} \sum_{i=1}^{N} L(y_i, \hat{y}_i(\theta)) + \lambda \|W\|_F^2

                其中 λ 是正则化项的系数,W 是权重矩阵,\|W\|_F^2​ 是权重的 Frobenius 范数。

(2)梯度下降

        反向传播的目标是计算损失函数 J 相对于每一层的权重和偏置的梯度,使用链式法则进行计算。我们从输出层开始,逐层向后计算梯度。

        损失函数关于参数 w_{i,j}^{(l)} 的梯度为

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \frac{\partial J}{\partial w_{i,j}^{(l)}} = \frac{\partial J}{\partial z_i^{(l)}} \cdot \frac{\partial z_i^{(l)}}{\partial w_{i,j}^{(l)}}

其中:

  • 由于 z^{(l)} = W^{(l)} a^{(l-1)} + b^{(l)}(当 l=1时,此公式为 z^{(l)} = W^{(l)} x + b^{(l)}),所以  \frac{\partial z_i^{(l)}}{\partial w_{i,j}^{(l)}} 容易计算,为:\left\{ \begin{array}{ll} a_j^{(l-1)} & \text{if } l > 1 \\ x_j & \text{if } l = 1 \end{array} \right.
  • \frac{\partial J}{\partial z_i^{(l)}}需要使用反向传播算法计算。

(3)反向传播

即计算  \frac{\partial J}{\partial z_i^{(l)}} ,记为 \delta _i^{(l)} ,被称为误差项。

3.1 输出层的误差项:

输出层的误差是损失函数对输出的梯度:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​         \delta^{(L)} = \nabla_{\mathbf{a}} L \circ \sigma'(\mathbf{z}^{(L)})

其中,\nabla_{\mathbf{a}} L 是损失函数关于输出的梯度,\sigma'(\mathbf{z}^{(L)}) 是激活函数的导数,\circ 表示Hadamard积(元素乘法)。

对于常见的损失函数(如均方误差),有:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​         \nabla_{\mathbf{a}} L = \hat{y} - y

3.2 计算隐藏层的梯度

对于第 l 层的误差 \delta^{(l)},我们有:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \delta^{(l)} = \left( \mathbf{W}^{(l+1)} \right)^T \delta^{(l+1)} \circ \sigma'(\mathbf{z}^{(l)})

这里,\delta^{(l+1)} 是上一层的误差,\sigma'(\mathbf{z}^{(l)}) 是激活函数对第 l 层加权输入的导数 。

(4)权重更新

一旦得到了每一层的误差,接下来通过梯度下降法更新权重和偏置。

  • 权重更新规则:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \mathbf{W}^{(l)} := \mathbf{W}^{(l)} - \eta \frac{\partial L}{\partial \mathbf{W}^{(l)}}

        其中,学习率为 \eta\frac{\partial L}{\partial \mathbf{W}^{(l)}} 是损失函数对权重的梯度。

        梯度的计算为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​          \frac{\partial L}{\partial \mathbf{W}^{(l)}} = \delta^{(l)} \left( \mathbf{a}^{(l-1)} \right)^T

  • 偏置更新规则:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​           \mathbf{b}^{(l)} := \mathbf{b}^{(l)} - \eta \frac{\partial L}{\partial \mathbf{b}^{(l)}}

        梯度的计算为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​           \frac{\partial L}{\partial \mathbf{b}^{(l)}} = \delta^{(l)}

(5)梯度消失和梯度爆炸

反向传播的误差传递公式:

数值结果:

  • 梯度爆炸:
    1.5^{100} \approx 4 \times 10^{17}

  • 梯度消失:
    0.8^{100} \approx 2 \times 10^{-10}

        这部分展示了梯度爆炸和梯度消失问题,尤其在深层网络中,随着层数的增加,如果激活函数选择不适当,激活函数的导数不接近1,梯度传递过程可能导致梯度逐渐变大(爆炸)或逐渐变小(消失)。

  • 梯度爆炸问题会导致训练过程对学习率敏感。

梯度消失问题会导致梯度趋近于0,无论学习率为多少,训练都没有进展,即只有顶层训练有效,网络变深也不会使得效果变好,即前边的隐藏层无论多少,都没有被训练。

三、为什么要有深度模型

1、两类模型比较

        ​​​​​​​        

参数一定时,模型胖矮好还是瘦高好?

实验:

        ​​​​​​​        ​​​​​​​        

实验证明:瘦高更好。

如何解释呢?

2、瘦高模型表达能力更强的解释

(1)分层组合与层次结构

  • 分层组合思想:
    深层网络能够将一个复杂的函数分解为多个简单函数的嵌套组合。假设一个目标函数 f(x) 可以表示为多个子函数的组合:

            ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        f(x) = f^{(L)}\big(f^{(L-1)}(\cdots f^{(1)}(x)\cdots )\big)

    每一层只需要学习相对简单的映射,逐层提取和转换特征,这种结构正好符合许多实际问题中数据的内在层次性。

  • 高效表示:
    通过深层结构,网络可以在每一层提取出中间表示,然后在下一层进行进一步组合。相比之下,浅层网络(胖矮模型)必须在一层内直接捕获输入到输出的复杂映射,这往往需要指数级更多的神经元才能达到同样的效果。

(2)参数利用率与“指数”优势

  • 参数利用效率:
    理论上,有研究表明对于某些特定函数类,深层网络可以用指数级更少的参数来表示,而浅层网络可能需要指数级的宽度才能逼近同样的函数。也就是说,深层结构具有“参数共享”或“复用”中间特征的优势,使得每个参数在构建复杂映射时能发挥更大的作用。

  • 数学直观:
    如果我们考虑一个由多层非线性激活函数构成的网络,假设每层用ReLU激活函数,深层网络可以形成许多线性区域。研究发现,随着深度的增加,网络能够划分出指数级别数量的线性区域,从而具有更高的函数拟合能力。这意味着深层网络在表达非线性、复杂函数方面具有理论上的优势。

(3)局部特征的逐层抽象

  • 逐层抽象:
    “瘦高”模型的每一层都能逐步抽象出更高级的特征,从原始输入到低级特征,再到中级和高级特征,最后得到用于决策的表示。这样的逐层抽象使得模型能够更精细地捕捉数据的结构信息。

  • 对比浅层模型:
    “胖矮”模型虽然单层拥有大量神经元,能够在单层内提取丰富信息,但由于层次结构较少,难以捕捉输入数据中的多层次、递归性的特征组合,从而在表达复杂关系上往往不如深层结构高效。

(4)理论支持

  • 表达能力理论:
    许多理论工作表明,对于特定类别的函数,深层网络在表达能力上具有“深度优势”(depth efficiency)。例如,一些文献证明,若使用深度为 LLL 的网络,其表示能力可以达到浅层网络所需参数数量的指数级减少。这为“瘦高”模型在理论上比“胖矮”模型更有效地表达复杂函数提供了数学依据。

四、卷积神将网络

1、对图像为什么要用卷积网络

(1)局部感受野与局部连接

  • 局部相关性:
    图像中相邻像素往往具有很强的相关性,例如边缘、纹理和颜色变化都是局部特征。卷积层通过局部感受野只关注输入图像的局部区域,能够高效捕捉这些低级特征,而不需要每个神经元与全图所有像素连接。

  • 数学描述:
    对于输入图像 X 和卷积核 K ,卷积操作可表示为:

         (X * K)(i, j) = \sum_{m} \sum_{n} X(i+m, j+n) \cdot K(m, n)

    这种局部计算方式使得网络在提取特征时只需关注图像的局部信息。

(2)参数共享与降低模型复杂度

  • 参数共享:
    卷积核在整个图像上滑动应用,意味着同一组权重被用于不同的局部区域。这种权重共享机制显著减少了需要学习的参数数量,相比全连接层(每个像素都需要独立连接)能大幅降低模型复杂度。

  • 好处:
    降低参数数量不仅减少了内存需求和计算量,也降低了过拟合的风险,使得模型在数据量有限时更为稳定。

(3)平移不变性(Translation Invariance)

  • 平移不变性原理:
    由于卷积核在图像的各个位置进行相同的操作,卷积层对图像中物体的平移具有天然的不变性。也就是说,无论特征在图像的哪个位置出现,卷积层都能检测到相同的特征。

  • 实际意义:
    这使得卷积神经网络在处理实际图像时更具鲁棒性,能够有效识别出移动或位置略有偏移的目标。

(4)层次特征提取

  • 多层结构:
    CNN通常由多个卷积层和池化层堆叠而成,较低层可以捕捉到边缘、角点等简单特征,而较高层则可以组合低级特征构成更复杂的形状和语义信息(如物体的一部分或整体结构)。

  • 特征层次化:
    这种逐层抽象的能力使得卷积神经网络能够自动学习到从低级到高级的多层次特征表示,适应不同复杂度的任务需求。

(5)池化层的作用

  • 降维与抗噪:
    池化层(如最大池化、平均池化)对卷积层的输出进行下采样,降低了特征图的尺寸,减少计算量,同时对输入的微小变形和噪声具有一定的鲁棒性。

  • 平滑特征:
    通过池化层,可以进一步增强特征的不变性,使得后续的全连接层或分类器能够更好地利用这些抽象出的特征。

(6)总结

        卷积神经网络之所以在图像处理上更为优秀,主要在于它利用了图像数据的局部性和空间结构,通过局部感受野和参数共享机制大幅降低模型复杂度,并通过多层结构逐步抽象出高层次特征。同时,平移不变性和池化层的应用使得CNN对于图像中的位移、旋转以及噪声具有较好的鲁棒性。正是这些特点,使得卷积神经网络成为图像分类、目标检测、图像分割等任务中的主流模型。

2、卷积层

(1)核心特点(也是卷积神经网络相比于全连接神经网络的特点)

局部链接:卷积神经网络(CNN)中,每个神经元仅与前一层的部分区域(即局部感受野)相连接,而不是与整张输入图像或上一层的所有神经元连接,从而减少了参数数量和计算量。

权值共享:在卷积层中,同一卷积核(滤波器)在整个输入图像上滑动并应用相同的权重,允许模型学习图像中的局部特征,并减少了需要学习的参数数量。

局部链接和权值共享使得卷积神经网络的复杂度相比于全连接神经网络的复杂度大大降低。

(2)边缘填充

卷积操作前通常进行边缘填充,以保证卷积操作不会使得数据缩减。

一般选择 0 填充,但我认为扩散填充更好,即填充的值和其里边的值一样。

        

(3)多输入通道

输入有几个通道就需要几个卷积核,输出结果是所有通道卷积结果的和:

        ​​​​​​​      

有时输出通道也可以是多个,即多通道输入,多通道输出。

(4)一维卷积和三维卷积

最常见的卷积是二维卷积,但一维卷积和三维卷积也同样存在,

  • 一维卷积:主要是对一维信号进行处理,如:文本、语音、时间序列
  • 三维卷积:主要的三维信号有视频、医学图像等

(5)更多的花式卷积

                                5.1~5.4为在空间上的花式,5.5~5.7为在通道上的花式。

5.1 大小为1×1的卷积核

        

不识别空间模式,只是融合通道。

5.2 不同尺寸卷积核:inception v2

        ​​​​​​​        

Inception系列网络(如Inception v2)采用了多尺度处理的思想,在同一层中并行使用不同尺寸的卷积核(例如1×1、3×3、甚至5×5)来捕捉不同尺度的信息。

  • 多尺度特征提取: 大尺寸卷积核具有较大的感受野,能够捕捉全局或较大区域的特征;小尺寸卷积核则更适合提取细节信息。
  • 1×1卷积的作用: 1×1卷积通常用于降维或升维,使得后续使用大尺寸卷积时能降低计算量,同时融合跨通道信息。

数学描述与优化:

  • 如果直接用一个 5 \times 5 卷积核,其参数量为 5 \times 5 \times C_{in} \times C_{out} ​;
  • Inception v2中常将 5 \times 5 卷积拆分成两个连续的 3 \times 3 卷积(或者使用更精细的分解方式),这样参数量大约为 2 \times \left(3 \times 3 \times C_{in} \times C_{mid}\right) + 3 \times 3 \times C_{mid} \times C_{out}​ 既降低了参数量,也增加了非线性表达能力。

5.3 空洞卷积

        

5.4 可变形卷积核

标准卷积核:长方形或正方形 

可变形卷积:卷积核形状可变,只看到感兴趣的图像区域

        

5.5 分组卷积

基本思想:
分组卷积将输入特征图的通道分成多个组,每一组单独进行卷积运算,再将结果拼接起来。

  • 参数和计算量降低: 将通道分组后,每组卷积核只负责一部分通道,从而减少了参数数量和计算复杂度。
  • 信息局部性: 这种方式有时可以迫使不同组学习到不同类型的特征,增强网络表达能力。

数学描述:
设输入通道数为 C_{in}​,输出通道数为 C_{out}​,如果分为 g 组,则每组输入通道为 C_{in}/g ,输出通道为 C_{out}/g 。
标准卷积的参数量为

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        C_{in} \times C_{out} \times k \times k

而分组卷积的参数量则为

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        g \times \left(\frac{C_{in}}{g} \times \frac{C_{out}}{g} \times k \times k\right) = \frac{C_{in} \times C_{out} \times k \times k}{g}

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​     

5.6 深度可分离卷积

        ​​​​​​​        ​​​​​​​        ​​​​​​​          

基本思想:
深度可分离卷积将标准卷积分解为两步:

  1. Depthwise Convolution(逐通道卷积): 对每个输入通道单独进行卷积,每个通道使用一个卷积核。
  2. Pointwise Convolution(1×1卷积): 将逐通道卷积的输出进行通道间的线性组合,从而融合各通道信息。

优势与数学描述:

  • 参数和计算量大幅减少:
    • 标准卷积的计算量为 H \times W \times C_{in} \times C_{out} \times k \times k
    • 深度可分离卷积的计算量为 H \times W \times \left(C_{in} \times k \times k + C_{in} \times C_{out}\right)
  • 表达能力: 虽然参数较少,但经过逐通道和跨通道的两次卷积组合,仍能捕捉丰富特征。该结构在移动端网络(如MobileNet)中得到广泛应用。

5.7 通道洗牌

基本思想:
        在使用分组卷积时,由于每个组内的通道之间信息相对独立,可能会导致跨组的信息交流不足。通道洗牌操作通过对通道进行重新排列,打乱各组内部的通道顺序,从而让后续分组卷积能够接收到来自不同组的混合信息。

实现方法与作用:

  • 实现:
    1. 将输入特征图的通道维度按照分组数进行重塑(reshape),例如将形状从 (N, C, H, W) 变为 (N, g, C/g, H, W)
    2. 对分组后的通道维度进行转置;
    3. 再reshape回原始形状。
  • 作用:
    通过这种方式,不同分组内的信息得以交换,使得后续层在执行分组卷积时能跨组提取特征,增强模型的表达能力。
  • 应用:
    通道洗牌被广泛应用于轻量级网络(如ShuffleNet),在保持较低计算量的同时提升了网络的性能。

3、池化层

池化层即降采样层,常用的池化操作有两种:

  • 最大值池化:取一定区域的最大值
  • 平均值池化:取一定区域的平均值

池化层的作用:

  • 降低分辨率
  • 提供一定程度的平移不变性

4、卷积网络的模型训练

(1)卷积层的训练

卷积层的反向传播类似全连接层的反向传播(只是有参数共享和 局部连接)

(2)池化层的训练

2.1池化层反向传播的核心思想

        经过Pooling后,两层的feature map不一样大,为了保证梯度对位能传播下去,需要保证传递的loss(或者梯度) 总和不变

2.2 池化层的反向传播

        反向传播的目标是计算损失函数对池化层输入的梯度,然后将其传递给上一层。在池化层的反向传播中,我们会根据前向传播时池化操作的类型(最大池化或平均池化)来更新梯度。

最大池化的反向传播

  • 前向传播:在一个池化区域内,最大池化会选择最大的值作为输出,并记录下该值的位置
  • 反向传播:反向传播时,梯度仅通过前向传播时记录的最大值位置传递。其他位置的梯度值为零,因为在这些位置上池化操作没有影响。

        例如,如果池化窗口是2x2,且最大的值出现在位置(1,1),则在反向传播时,仅该位置的梯度会被传递到输入特征图,其他位置的梯度为0。保证池化前后的梯度(残差)之和保持不变。

平均池化的反向传播

  • 前向传播:平均池化计算区域内所有值的平均数作为输出。
  • 反向传播:在反向传播中,平均池化的梯度被均匀分配到池化窗口中的每个位置。也就是说,所有位置的梯度是相等的,等于该池化区域的梯度值除以池化窗口的元素个数。

        例如,对于一个2x2的池化窗口,假设在前向传播中输出的梯度为0.4,则在反向传播时,0.4的梯度会均匀分配到四个位置,每个位置的梯度为0.1。保证池化前后的梯度(残差)之和保持不变。不是把梯度复制 K 遍之后直接反向传播回 去。 这样会造成loss之和变为原来的 K 倍, 网络是会产生梯度爆炸。

2.3 梯度的传播

无论是最大池化还是平均池化,池化层的反向传播都遵循以下的基本原则:

  • 最大池化 中,只有前向传播时最大值的位置会接收到梯度信息。
  • 平均池化 中,梯度被均匀分配到每个池化窗口的元素上。

2.4 池化层反向传播中的特殊注意事项
  • 梯度消失问题:池化层,尤其是最大池化层,由于只保留了最大值的梯度信息,可能会导致梯度在某些情况下非常小,影响模型的学习过程。
  • 池化层参数更新:池化层本身通常没有可学习的参数(例如权重和偏置),因此它只负责将输入的梯度传递到上一层。

附录

1、贝塞尔曲线 与 B样条

(1)Langrange插值

        如果知道三个点P0,P1,P2,那么如何确定一条曲线呢?

        最简单的想法是,分别连接 PO,P1和 P1,P2,得到两个线段就可以确定一个曲线,但它不平滑,一阶导数不连续。二次曲线:三个点可以确定一条抛物线,最直接的做法是列三个方程,解方程组,得到二次曲线。类似地,可以递推到更多点。对于n个点,可以使用n-1阶次的函数来确定一个唯一的曲线。这就是多项式插值。

拉格朗日插值法:

  • 简述:假设有 n 个点 (x_1, y_1), (x_2, y_2), \dots, (x_n, y_n),其中 x_i​ 互不相同。对于每一个 k (1 到 n 之间),定义 n−1 次多项式 L_k(x) 如下:

        ​​​​​​​        ​​​​​​​           L_k(x) = \frac{(x - x_1)(x - x_2) \dots (x - x_{k-1})(x - x_{k+1}) \dots (x - x_n)}{(x_k - x_1)(x_k - x_2) \dots (x_k - x_{k-1})(x_k - x_{k+1}) \dots (x_k - x_n)}

  • Lagrange 基函数的性质

    • L_k(x_k) = 1
    • L_k(x_j) = 0 对于 j \neq k
  • 构建插值多项式:使用上述的基函数,构造 n−1 次的拉格朗日插值多项式 P_{n-1}(x) 如下:

    P_{n-1}(x) = y_1 L_1(x) + y_2 L_2(x) + \dots + y_n L_n(x)

    这个多项式 P_{n-1}(x) 满足 P_{n-1}(x_i) = y_i​,其中 i = 1, 2, \dots, n 。

Runge现象:

  例子:

  • 已知区间 [−1,1] 上函数 f(x) = \frac{1}{1 + (5x)^2}​,取等距节点 x_i = -1 + \frac{i}{5}​,其中 i = 0, 1, 2, \dots, 10 。

  • 通过拉格朗日插值法,构造 L_{10}(x) 多项式:

    L_{10}(x) = \sum_{i=0}^{10} f(x_i) l_i(x)

    其中,l_i(x) 为拉格朗日基函数。

  • 从图中可以看出,在 x=0 附近,L_{10}(x) 能较好地通过 f(x),但在某些地方,如区间 [−1,−0.8] 和 [0.8,1] 之间,L_{10}(x)f(x) 差异很大,这种现象称为 Runge现象

  • 由于插值法要求曲线一定要经过规定的一系列点,这样的限制很强,又由于点数很多,次数很高,会导致振荡的很厉害。

因此可采用拟合法,放松限制,让曲线不一定要必须经过某些点,常见的又最小二乘法,贝塞尔曲线等。

  • 依据原有数据点,通过参数调整设置,使得生成曲线与原有点差距最小(最小二乘),因此曲线未必会经过原有数据点。
  • 样条曲线(Spline curves):是给定一系列控制点而得到的一条曲线,曲线形状由这些点控制。一般分为插值样条和拟合样条。

(2)样条曲线 和 贝塞尔曲线

i、样条曲线:

        一个简单且行之有效的方法是,把这些点作为限制点,然后在这些限制点中放置一条具有弹性的金属片,最后金属片绕过这些点后的最终状态即为所需曲线。而最终得到的形状曲线,就是样条曲线。这也是该名字的由来,其中金属片就是样条,形成的曲线就是样条曲线。

        该想法虽然巧妙,但显然不具有推广性。因此问题就出来了,如何将其抽象出一个数学模型,从而在已知控制点条件下,仅仅通过数学公式从而获得平滑的样条。下面的贝塞尔曲线的限制比这个例子还要松,贝塞尔曲线不需要曲线过所有限制点。

ii、贝塞尔曲线:

三个点确定的贝塞尔曲线(二次贝塞尔曲线):

  • 公式:

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​          P_x = (1 - t)^2 P_0 + 2t(1 - t) P_1 + t^2 P_2

这是一个二次Bezier曲线的标准公式,其中 P_0​, P_1​, P_2​ 是控制点,t 是参数,范围通常为 [0, 1]。

  • 构建过程:

  • 1. 定义新的控制点:

                                                   P_i = (1 - t)P_0 + P_1                

        ​​​​​​​        ​​​​​​​        ​​​​​​​                              P_j = (1 - t)P_1 + P_2

        P_i 和 P_j 分别是线段 P_0P_1 和 P_1P_2 上的点,且 t 从0~1的过程中 P_i 和 P_j 从线段的一段到另一端。

  • 2. 构建Bezier曲线:

            ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​               P_x = (1 - t)P_i + tP_j
  • 3. 相关关系:

            ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​              \frac{P_0P_i}{P_0P_1} = \frac{P_1P_j}{P_1P_2} = \frac{P_iP_x}{P_iP_x} = t

        t 从0~1的变化过程使得这段贝塞尔曲线就生成了。这段内容介绍了如何通过线性插值方式逐步构建Bezier曲线,逐渐从控制点计算出曲线的具体点。

n+1 个点确定的贝塞尔曲线(n 次贝塞尔曲线):

假设有 n+1 个点,确定了 n 次的贝塞尔曲线,公式为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​             B(t) = \sum_{i=0}^{n} C_n^i (1 - t)^{n-i} t^i P_i, \quad t \in [0, 1]

另一种表示形式:

                                    ​​​​​​​B(t) = W_t^{0,n} P_0 + W_t^{1,n} P_1 + \dots + W_t^{n,n} P_n

        解释:

        可以将 W_t​ 理解为基(当 n 确定时,这组基就是确定的),P 为这组基的线性组合系数。

        这段内容描述了贝塞尔曲线的两种表示方式。第一种是通过控制点和对应的基函数来定义,第二种则通过权重 W_t​ 和控制点 P_i​ 来表示。

 例子:三次基函数,也就是为了拟合四个点,共四个基。

        ​​​​​​​        

iii、贝塞尔曲线的递推公式

当阶数很高时,贝塞尔曲线不易求解,所以可以由递推公式求解。

     n 阶贝塞尔曲线 B^n(t) 可以由前面 n 个点决定的 n−1 次贝塞尔曲线 B^{n-1}(t|P_1, P_2, \dots, P_n) 线性组合推导而来,公式为:

B^n(t|P_0, P_1, \dots, P_n) = (1 - t) B^{n-1}(t|P_0, P_1, \dots, P_{n-1}) + t B^{n-1}(t|P_1, P_2, \dots, P_n)

      这段内容描述了如何通过递归方式来构建贝塞尔曲线,每一步都利用前一阶贝塞尔曲线的线性组合来构造下一阶曲线。递归公式使得贝塞尔曲线的计算可以通过逐步逼近的方式进行。对于 n 阶贝塞尔曲线,可以通过逐步计算 (n−1) 阶的曲线,然后用一个简单的线性插值来结合控制点,得到更高阶的曲线。这不仅减少了复杂度,还方便了贝塞尔曲线的实现。

iv、贝塞尔曲线的性质与特点​​​​​​​
  • 贝塞尔曲线幂次=控制点个数-1,幂次越高,需要的计算也越复杂,效率低。
  • 控制点与凸包性质:贝塞尔曲线总是位于其控制点构成的凸包内,这意味着曲线不会出现剧烈的波动,能够保证较好的稳定性和直观的几何解释。
  • 端点插值性质:曲线在 t=0 时必定通过第一个控制点 P0,在 t=1 时通过最后一个控制点 Pn​,这有利于曲线的拼接和连接。
  • 切线性质:贝塞尔曲线在起点和终点处具有明确的切线方向:在 t=0 处,切线方向由向量 P1−P0 决定;在 t=1 处,切线方向由向量 Pn−Pn−1 决定。
  • 仿射不变性:曲线对仿射变换(平移、旋转、缩放)具有不变性,即对控制点做任意仿射变换,曲线形状会随之相应变换,但基本性质不变。这为曲线在不同坐标系或图形环境中的应用提供了便利。
  • 变差递减(Variation Diminishing)性质:贝塞尔曲线不会比其控制多边形“更加波动”,这意味着当与直线相交时,曲线的交点数不会超过控制多边形与直线交点数,从而保证了曲线的平滑性。

(3)B样条

        对于复杂曲线,不要求用n-1次曲线,而是让次数低一点经常使用三次贝塞尔曲线一段一段地拼接成目标曲线,如Ps或Ai中使用钢笔工具画出物体轮廓所做的那样。
        确保最终整体曲线一次光滑的条件是在连接如果使用这种方法,点两侧的斜率相等,即连接点和其两侧控制点共线。

i、基本概念

        B样条曲线是利用一组控制点和一个节点向量(knot vector)定义的分段多项式曲线。它的主要特点在于:

  • 局部控制:每个控制点只影响曲线的一部分,使得局部修改不影响整体形状。
  • 高连续性:通过适当设置节点向量,可以控制曲线在各段之间的连续性(如 C^0, C^1, \ldots, C^{p-1} 连续,其中 p 为曲线的阶数)。
  • 灵活性:能够表示复杂形状,同时可推广到曲面(B样条曲面)和更高维度的数据拟合问题中。
ii、数学定义与构成要素

节点向量(Knot Vector)

        节点向量是一系列非递减的实数序列,记为

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        U = \{ u_0, u_1, \dots, u_{m} \}, \quad \text{ } m = n + p + 1

  • p 是曲线的阶数(通常阶数 p+1 表示多项式的次数,如三次曲线 p=3)。
  • n+1 表示控制点的数量。
  • 节点向量确定了曲线参数 t 的分段区间以及每个分段的多项式基函数的定义区间。常见的节点向量类型包括均匀节点向量、非均匀节点向量和开放节点向量(Open Uniform Knot Vector)。

B样条基函数

        B样条的核心在于一组基函数 N_{i,p}(t),它们采用递归定义,通常称为 Cox-de Boor 递归公式:

  • 零次基函数(阶数为 0,即 p=0)定义为:

         N_{i,0}(t) = \begin{cases} 1, & \text{if } u_i \leq t < u_{i+1}, \\ 0, & \text{else.} \end{cases}
  • 递归定义(对于 p \geq 1):

       N_{i,p}(t) = \frac{t - u_i}{u_{i+p} - u_i} \, N_{i,p-1}(t) + \frac{u_{i+p+1} - t}{u_{i+p+1} - u_{i+1}} \, N_{i+1,p-1}(t)

    其中如果分母为 0,则该项通常定义为 0。这一递归公式确保了每个 N_{i,p}(t) 是一个分段多项式,且仅在区间 [u_i, u_{i+p+1}) 内有非零值。

B样条曲线的定义

        给定控制点 P_0, P_1, \dots, P_n 和对应的节点向量 U,B样条曲线可定义为:

        ​​​​​​​        ​​​​​​​        ​​​​​​​            C(t) = \sum_{i=0}^{n} N_{i,p}(t) \, P_i, \quad t \in [u_p, u_{m-p})

其中 N_{i,p}(t) 为阶数为 p 的 B样条基函数。曲线的形状由控制点的位置和节点向量决定。

iii、主要性质
  • 局部性:由于每个基函数 N_{i,p}(t) 的非零区间仅局限于 [u_i, u_{i+p+1}),一个控制点 P_i​ 只影响曲线中对应的参数区间。这种局部控制特性使得修改某个控制点只对曲线的局部区域产生影响,而不会波及整体形状。
  • 连续性控制:B样条曲线的连续性依赖于基函数的阶数 p 以及节点向量中节点的重复次数。一般来说,如果节点 u_i​ 重复次数为 k( k \leq p ),那么在该节点处曲线的连续性为 C^{p-k} 。
  • 高阶连续:合理选择节点向量可以使曲线在各段之间具有较高的连续性,例如三次 B样条( p=3 )在没有重复节点的情况下具有 C^2 连续性。
  • 凸包性:曲线始终位于其相应控制点的凸包内,这保证了曲线的数值稳定性和几何直观性。
  • 仿射变换不变性:B样条曲线对仿射变换(平移、旋转、缩放)保持不变,即对控制点做任意仿射变换,曲线形状会相应变换,但基本性质不变。

相关文章:

  • AI Agent 时代开幕-Manus AI与OpenAI Agent SDK掀起新风暴
  • 4.2 Reactive 对象的深度类型约束方案
  • 婚恋之红娘相亲小程序开发功能与设计详解
  • 福特售后再添亮点,为烈马模块化车身改装提供专业支持
  • Qt运行xxx.so can not open shared object file
  • MacOS 上使用终端彻底格式化 U 盘
  • 介绍HTTP协议基本结构与Linux中基本实现HTTPServer
  • 如何取消GitHub Copilot订阅付费?
  • 非零初始条件系统的传递函数分析
  • Kafka的零拷贝
  • 推荐系统基础
  • 【2025】基于python+django的驾校招生培训管理系统(源码、万字文档、图文修改、调试答疑)
  • linux 命令 tree
  • 神经网络:定义与核心原理
  • 【Python】08、元组
  • 工程化与框架系列(35)--前端微服务架构实践
  • 递归时间复杂度(master),时间复杂度为O(NlogN)的排序
  • 使用spring data MongoDB对MongoDB进行简单CURD操作示例
  • 嵌入式人工智能应用- 第九章 物体识别
  • 织梦dedecmsV5.7提示信息提示框美化(带安装教程和效果展示)
  • 水中托举救出落水孩童后遇难,42岁退役军人高武被确认为见义勇为
  • 云南省司法厅党委书记、厅长茶忠旺主动投案,正接受审查调查
  • 宋涛就许历农逝世向其家属致唁电
  • 美权威人士批“特朗普对进口电影征关税”:将杀死美电影产业
  • 新华每日电讯“关爱青年成长”三连评:青春应有多样的精彩
  • 巴菲特批评贸易保护主义:贸易不该被当成武器来使用