【HowTo ML】分类问题->神经网络入门

本文探讨了非线性分类器在复杂数据空间的应用及其必要性,并详细介绍了神经网络的基本概念、架构与训练方法,包括前向传播、反向传播算法及随机初始化等关键环节。

非线性分类器(Non-linear hypotheses)

为什么使用非线性分类器

我们举几个栗子:
house
假如我们有一个数据空间如左上角坐标系所示,那么我们要的模型需要如右边公式所示的预测函数.
假设有n个特征那么计算二次多项式就有O(n^2)的复杂度.n能有多大?我们来看下面这个栗子.
Car
假设我们需要识别汽车,假如选取图像上两个点,那么就如左边坐标系所示,这没什么.
但实际上我们需要的数据空间时整张图片所有的像素.也就是假设图像是5050那么我们就有2500个像素点.也就是需要2500个特征.
刚才说的是灰度图,如果时RGB的话时7500个,实际运用中也不只5050 这么小.
综上所述,线性分类器肯定是不行的.

神经网络

神经网络是模拟人类的神经元时发明的.
TrueNeural

神经网络的表示

SingalNeural
一个神经元(Neuron)就是如图所示,他和我们的逻辑回归表示并没有什么区别.
Sigmoid Function叫做激励(activation)函数.
θ也被成为权重(weights)
network1
神经网络由多个神经元连接而成,其中第一层被称为输入层(input layer);最后一层被称为输出层(output layer);其他的被称为隐藏层(Hidden layer).

记号

mark

  • a(j)i:
    第j层第i个激励
  • Θ(j)(波矩阵?):
    第 j 层到第 j+1 层的参数控制映射

我们通常使用Θ(j)矩阵来表示参数,表示方法如上所述.其中Θ的大小为(sj+1(sj+1),sj 为第j层激励的个数.

向量化(Vectorized)实现

Vectorized
我们可以将通过向量化来简化神经网络的计算.
我们可以把左下角图中Layer 2的Sigmoid函数提出,这样我们可以用Θ向量的形式表示出整个Layer 2.
也就是右边所示的过程.
写成一般形式就是:

Adda(i1)0=1z(i)=Θ(i1)a(i1)a(i)=g(z(i))

我们循环执行这个步骤.直到输出层输出hΘ(x),这就是前向传播(Forward propagation).

架构(Architecture)

Architecture
我们把神经元连接的方式叫做架构.

神经网络栗子

AndFunction
为了方便我们理解神经网络,这里有几个栗子.
假如我们有右边的数据空间,那么比较好的边界就是如图所示.
我们先简化数据为左边的图,也就是说我们需要训练一个模型求得左下的y式,很复杂.
AndFunction
我们先来个简单的AND运算.如上图,假设我们的theta如下

θ=30+20+20

那么就能预测出如真值表的值.
那么同理,我们就能训练出能求或与非的模型.那么我们要求XNOR运算怎么办?
AndFunction
这里我们来构建一个神经网络,每个节点训练出不同的模型,达到不同的效果,最后达到输出层.

多类别分类

之前说过多类别分类问题采用(one vs all)
MC
假设我们有4个类别需要识别,那么我们就有四个分类器.
MC
每个分类器的含义同之前,P(y=j|θ(i)j).

代价函数


Tips:
数据空间=

{(x(1),y(1)),(x(2),y(2)),(x(m),y(m))}

L=

Sl=l.

在神经网络中,神经单元的代价函数就是逻辑回归中的代价函数的一般式.

hΘ(x)RK(hΘ(x))i=ithoutput

J(Θ)=1m[i=1mk=1Ky(i)klog(hΘ(x(i)))k+(1y(i)k)log(1(hΘ(x(i)))k)]+λ2ml=1L1i=1slj=1sl+1(Θ(l)ji)2

解释一下:
hΘ(x)RK就是神经网络的输出在K维向量中,二元分类K就是1
(hΘ(x))i表示第i个输出.
y(i)klog(hΘ(x(i)))ky是一个K维向量,yk就是第K维向量,如果这组样本属于第K组,那么yk就是1,vise varsa.
需要注意的是sl+1j=1中依旧可以遵循”不把偏差项Θ(l)i0 (j=0)正规化”.

反向传播算法(Backpropagation Algorithm)

我们的目标是:

minΘJ(Θ)

为了找到这个Θ,我们需要计算:
  • J(Θ)
  • Θ(l)ijJ(Θ)

其中J(Θ)我们已经知道了怎么计算.
那么我们需要计算的就是J(Θ)的偏导,这时候我们用到反向传播算法:
直观上来说就是对每一个节点计算δ(l)j(第l层第j个节点的误差).
假设我们有一个网络如图:
delta
首先我们从输出节点开始求δ(4)
δ(4)j=a(4)jyj.
变成向量化的形式:δ(4)=a(4)y
然后往前倒推:
δ(l)=(Θ(l))Tδ(l+1).g(z(l)),其中g(z(l))=a(l).(1a(l)).
直到l=1,输入层不需要计算误差.
那么忽略λ,需求偏导公式可变为:
Θ(l)ijJ(Θ)=a(l)jδ(l+1)i

实现

BPimplement
使用上述公式Θ(l)ijJ(Θ)=a(l)jδ(l+1)i需要使用aδ.
我们引入Δ,Δ(l)ij是用于计算Θ(l)ijJ(Θ)的一个累加项.
对于每一组样例,
我们先用FP来计算a,再反向计算误差δ(l)
最后按照偏导项公式累加Δ,得到公式:

Θ(l)ijJ(Θ)=D(l)ij=1mΔ(l)ij+λΘ(l)(ij)

若将Δ向量化得到Δ(l):=Δ(l)+δ(l+1)(a(l))T.

矩阵向量化(Matrices “Unroll” into vectors)

vectorized
fminunc这些高级函数在使用的时候需要传递向量,而Θ这种却是矩阵.
我们可以把矩阵展开,来达到向量化的目的,然后在costFunction中重组Θ等矩阵.
Unroll

梯度检测(Gradient Checking)

简单的说就是使用双侧差分(two sided difference)求近似导数.
gradApprox
在神经网络中具体实现就是如下.
gradApprox
一般我们取ϵ103,然后检验上述所得向量(gradApprox)近似于DVec.
总结:
1. BP求DVec.
2. 求gradApprox.
3. 检测是否相似
4. 关闭检测(因为梯度检测很慢),使用BP学习.

随机初始化(Random Initialization)

经过之前的学习,我们发现每一层的所有单元都会经过相同的训练.所以我们使用随机初始化来打破这种对称性.
随机初始化指的是随机化初始的参数矩阵,使他们接近0却不完全相同.

总结

架构(Architecture)

Sumary
- 输入单元数:特征空间维度.
- 输出单元数:类数
- 隐藏层:通常为一层,每层激励个数相同,数量选择时需要考虑输入输出层,通常稍大于输入层.

训练

  1. 随机初始化权重.
  2. FP求hΘ,也就是a.
  3. 计算代价函数J(Θ)
  4. BP求 Θ(l)ijJ(Θ).
  5. 使用梯度检测比较BP所求Θ(l)ijJ(Θ),然后关闭梯度检测.
  6. 使用梯度下降等算法和BP求Θ(J(Θ)是非凸函数).

神经网络背景知识

起源

人们想要模拟大脑,因为大脑是最好的学习模型.
兴起与80s~90s,但随后衰退.但是今年由于数据量和计算速度的提高又变得兴起

思考

人类的大脑能学习很多的东西,比如分辨事物,学习,计算,说话等等.
我们也能写很多算法来模拟这些”任务”,实现该过程.但是大脑的学习应该是只有一个学习算法的(The “one single learning algorithm” hypothesis).

实验(Neural Re-wired Experiment)

experiment
科学家把动物视神经切断,而把听觉神经连接到本来由视神经连接的位置(视觉皮层),最后发现动物能完成视觉辨别任务.
rewiredusing
左上角:在额头上佩戴灰度摄像机,数据输出到舌头的电极,刺激舌头.失明的人能在几十分钟内学会”看”.
右上角:人类声呐定位.通过打响指或者咂舌来制造声音,通过听觉来分辨回声,定位周围的物体(这是一种训练,手机上玩过一个游戏叫 Echo还是Dark Echo的就是这种感觉).
左下角:蜂鸣腰带,朝向北时腰带蜂鸣很强,使人类拥有鸟类的方向感(这个..恩..).
右下角:给青蛙按第三只眼睛,青蛙能学着使用(卧槽,那岂不是给人类大脑接一个高清摄像头就行,学习量可能有点大吧)

### 如何在 Jupyter Notebook 中使用 Mermaid 绘制图示或流程图 要在 Jupyter Notebook 中使用 Mermaid 来绘制图示或流程图,可以借助 `mermaid` 扩展或者通过 HTML 的方式嵌入 Mermaid 语法。以下是具体方法: #### 方法一:安装并加载 `jupyter_contrib_nbextensions` 1. 安装扩展包 使用以下命令安装 `jupyter_contrib_nbextensions` 和其依赖项: ```bash pip install jupyter_contrib_nbextensions jupyter contrib nbextension install --user ``` 2. 启用 Mermaid 支持 运行以下命令启用 Mermaid 插件: ```bash jupyter nbextension enable mermaid/mermaid ``` 3. 编写 Mermaid 图表代码 在单元格中直接编写 Mermaid 语法即可渲染图表。例如: ```mermaid graph TD; A[Christmas] -->|Get money| B(Go shopping); B --> C{Let me think}; C -->|One| D[Yello]; C -->|Two| E[Blue]; C -->|Three| F[Red]; ``` 此方法利用了 Jupyter 的插件机制[^1]。 #### 方法二:通过 HTML 嵌入 Mermaid 如果不想安装额外的扩展,可以直接在 Notebook 单元格中引入 Mermaid 库并通过 HTML 渲染图表。 1. 加载 Mermaid JavaScript 文件 创建一个新的代码单元格,并运行以下代码以加载 Mermaid 脚本: ```javascript %%html <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script> <script>mermaid.initialize({startOnLoad:true});</script> ``` 2. 编写 Mermaid 图表代码 接下来,在另一个 Markdown 或 Raw NBConvert 单元格中输入 Mermaid 代码块。例如: ```markdown ```mermaid sequenceDiagram participant Alice participant Bob Alice->John: Hello John, how are you? loop Healthcheck John->John: Fight against hypochondria end Note right of John: Rational thoughts <br/>prevail... John-->>Alice: Great! John->Bob: How about you? Bob-->>John: Jolly good! ``` ``` 这种方法无需安装任何 Python 包,仅需加载外部脚本即可实现功能。 ```python from IPython.display import display, HTML # 动态加载 Mermaid 并显示图表 display(HTML(""" <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script> <div class="mermaid"> graph TD; A[Start] --> B{Decision}; B -->|Yes| C[Action]; B -->|No| D[End]; </div> """)) ``` 以上两种方法都可以有效地支持 Mermaid 图形化表示的需求。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值