2021-06-10

学习心得:

		神经网络原理仅仅是求导 偏导来进行传递信息,而现在要教会你的是如何在计算机中实现这一个过程,考试考的内容书上都有.
		在学习方面你主要靠自己,不会就在网络上搜索与一般都会有答案,室友和别人不学习是他们的事,但无论如我们自身都必须丰富我们的知识。
		学习的越多,我们就越知道我自身的所了解的东西之少,但与此同时即使我有时间却看不下去书,别人能考985
		211是因为他们能够准确分配自己时间来学习。而且计算机内卷的厉害我们没有时间浪费了,至少出去的时候我们能拿出一门语言去工作,希望能够好好经历这一生。

1 神经元细胞的数学模型

神经网络如下图

神经元的数学/计算模型

输入 input

( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3) 是外界输入信号,一般是一个训练数据样本的多个属性,比如,我们要预测一套房子的价格,那么在房屋价格数据样本中, x 1 x_1 x1 可能代表了面积, x 2 x_2 x2 可能代表地理位置, x 3 x_3 x3 可能代表朝向。另外一个例子是, ( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3) 分别代表了(红,绿,蓝)三种颜色,而此神经元用于识别输入的信号是暖色还是冷色。

权重 weights

( w 1 , w 2 , w 3 ) (w_1,w_2,w_3) (w1,w2,w3) 是每个输入信号的权重值,以上面的 ( x 1 , x 2 , x 3 ) (x_1,x_2,x_3) (x1,x2,x3) 的例子来说, x 1 x_1 x1 的权重可能是 0.92 0.92 0.92 x 2 x_2 x2 的权重可能是 0.2 0.2 0.2 x 3 x_3 x3 的权重可能是 0.03 0.03 0.03。当然权重值相加之后可以不是 1 1 1

偏移 bias

还有个 b b b 是怎么来的?一般的书或者博客上会告诉你那是因为 y = w x + b y=wx+b y=wx+b b b b 是偏移值,使得直线能够沿 Y Y Y 轴上下移动。这是用结果来解释原因,并非 b b b 存在的真实原因。从生物学上解释,在脑神经细胞中,一定是输入信号的电平/电流大于某个临界值时,神经元细胞才会处于兴奋状态,这个 b b b 实际就是那个临界值。亦即当:

w 1 ⋅ x 1 + w 2 ⋅ x 2 + w 3 ⋅ x 3 ≥ t w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 \geq t w1x1+w2x2+w3x3t

时,该神经元细胞才会兴奋。我们把t挪到等式左侧来,变成 ( − t ) (-t) (t),然后把它写成 b b b,变成了:

w 1 ⋅ x 1 + w 2 ⋅ x 2 + w 3 ⋅ x 3 + b ≥ 0 w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 + b \geq 0 w1x1+w2x2+w3x3+b0

求和计算 sum

Z = w 1 ⋅ x 1 + w 2 ⋅ x 2 + w 3 ⋅ x 3 + b = ∑ i = 1 m ( w i ⋅ x i ) + b \begin{aligned} Z &= w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 + b \\\\ &= \sum_{i=1}^m(w_i \cdot x_i) + b \end{aligned} Z=w1x1+w2x2+w3x3+b=i=1m(wixi)+b

在上面的例子中 m = 3 m=3 m=3。我们把 w i ⋅ x i w_i \cdot x_i wixi变成矩阵运算的话,就变成了:

Z = W ⋅ X + b Z = W \cdot X + b Z=WX+b

  • 一个神经元可以有多个输入。
  • 一个神经元只能有一个输出,这个输出可以同时输入给多个神经元。
  • 一个神经元的 w w w 的数量和输入的数量一致。
  • 一个神经元只有一个 b b b
  • w w w b b b 有人为的初始值,在训练过程中被不断修改。
  • A A A 可以等于 Z Z Z,即激活函数不是必须有的。
  • 一层神经网络中的所有神经元的激活函数必须一致。

2. 梯度下降的数学理解

θ n + 1 = θ n − η ⋅ ∇ J ( θ ) (1) \theta_{n+1} = \theta_{n} - \eta \cdot \nabla J(\theta) \tag{1} θn+1=θnηJ(θ)(1)
其中:

  • θ n + 1 \theta_{n+1} θn+1:下一个值;
  • θ n \theta_n θn:当前值;
  • − - :减号,梯度的反向;
  • η \eta η:学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长;
  • ∇ \nabla :梯度,函数当前位置的最快上升点;
  • J ( θ ) J(\theta) J(θ):函数。

3.0.1损失函数的作用

损失函数的作用,就是计算神经网络每次迭代的前向计算结果与真实值的差距,从而指导下一步的训练向正确的方向进行。

如何使用损失函数呢?具体步骤:

  1. 用随机值初始化前向计算公式的参数;
  2. 代入样本,计算输出的预测值;
  3. 用损失函数计算预测值和标签值(真实值)的误差;
  4. 根据损失函数的导数,沿梯度最小方向将误差回传,修正前向计算公式中的各个权重值;
  5. 进入第2步重复, 直到损失函数值达到一个满意的值就停止迭代。

3.0.2 机器学习常用损失函数

符号规则: a a a 是预测值, y y y 是样本标签值, l o s s loss loss 是损失函数值。

  • Gold Standard Loss,又称0-1误差
    l o s s = { 0 a = y 1 a ≠ y loss=\begin{cases} 0 & a=y \\\\ 1 & a \ne y \end{cases} loss=01a=ya=y

  • 绝对值损失函数

l o s s = ∣ y − a ∣ loss = |y-a| loss=ya

  • Hinge Loss,铰链/折页损失函数或最大边界损失函数,主要用于SVM(支持向量机)中

l o s s = max ⁡ ( 0 , 1 − y ⋅ a ) y = ± 1 loss=\max(0,1-y \cdot a) \qquad y=\pm 1 loss=max(0,1ya)y=±1

  • Log Loss,对数损失函数,又叫交叉熵损失函数(cross entropy error)

l o s s = − [ y ⋅ ln ⁡ ( a ) + ( 1 − y ) ⋅ ln ⁡ ( 1 − a ) ] y ∈ 0 , 1 loss = -[y \cdot \ln (a) + (1-y) \cdot \ln (1-a)] \qquad y \in \\{ 0,1 \\} loss=[yln(a)+(1y)ln(1a)]y0,1

  • Squared Loss,均方差损失函数
    l o s s = ( a − y ) 2 loss=(a-y)^2 loss=(ay)2

  • Exponential Loss,指数损失函数
    l o s s = e − ( y ⋅ a ) loss = e^{-(y \cdot a)} loss=e(ya)

在Java中,我们可以使用SimpleDateFormat类来将时间字符串转换为年月日格式。首先,你需要创建一个SimpleDateFormat的对象,并指定日期格式,例如"yyyy-MM-dd"表示年月日的格式。然后,使用该对象的parse()方法将时间字符串解析为一个Date对象。最后,再次使用SimpleDateFormat对象的format()方法将Date对象格式化为另一种日期格式,例如"yyyy年MM月dd日"表示年月日的格式。 以下是一个示例代码: ```java import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DateConversion { public static void main(String[] args) { String dateString = "2021-06-10"; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = dateFormat.parse(dateString); SimpleDateFormat outputFormat = new SimpleDateFormat("yyyy年MM月dd日"); String formattedDate = outputFormat.format(date); System.out.println(formattedDate); } catch (ParseException e) { e.printStackTrace(); } } } ``` 在上面的代码中,我们首先创建了一个SimpleDateFormat对象dateFormat,用于解析时间字符串"2021-06-10"。然后使用parse()方法将时间字符串解析为一个Date对象date。接下来,我们再次创建了一个SimpleDateFormat对象outputFormat,用于定义输出的日期格式为"yyyy年MM月dd日"。最后,使用format()方法将Date对象date格式化为所需的日期格式,并将结果打印出来。 运行以上代码,将输出"20210610日"。这样,我们就成功地将时间字符串转换为年月日格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值