机器学习之神经网络基础

一、神经元模型 在研究人工智能的过程中,模拟生物的神经是一条很显然的道路。神经网络模型最初便是以模拟生物的神经网络为目的的。但是在早期算力不足的情况下,神经网络的效果并不怎么好。直到硬件基础成熟的最近一段时间,神经网络才发挥出超常的能力。 当然,此时经过改进、优化后的神经网络也在一定程度上偏离了最初模拟生物神经系统的初衷。当前的,以统计为基础的神经网络模型是否是实现强人工智能的有效方法也不得而知。但是我们还是有必要对神经网络模型,特别是作为神经网络的最小单元——神经元模型,做充分的介绍。因为事实证明了,这是一条有效的创造 AI 工具的途径。 单个神经元可以看做有多个输入 $x_j$,单个输出 $a$ 的函数。神经元模型具有如下属性: 权重 $\vec{w}, b$ 激发函数 $g(z)$ 所对应的函数为 $$ f_{\vec{w}, b, g(z)}(\vec{x}) = g(\vec{w} \cdot \vec{x} + b) $$ 取 $g(z) = \frac{1}{1 + e^{-z}}$, 与我们之前学习过的逻辑回归没有差别。 通过对这样的神经元按一定规则进行组合,便可以构造用于完成某种功能的神经网络。 二、神经网络层 对于一组输入,我们可以将其依次通过不同的神经元进行计算,计算的结果可以按顺序组成向量,作为一组新的输入。这种不断迭代的能力是神经网络的基础。我们称同一次计算使用的所有神经元为同一层的神经元。这些神经元组成了神经网络上的一层。不同层的组合构成了整个神经网络。 注意,同一层的神经元需要满足输入个数相同、激发函数相同。 从数学上讲,设输入为 $\vec{x} = (x_1, x_2, ..., x_n)$,输出为 $\vec{a} = (a_1, a_2, ..., a_m)$,神经元函数为 $f_1(\vec{x}), f_2(\vec{x}), ... f_m(\vec{x})$ 则 $$ \vec{a} = (f_1(\vec{x}), f_2(\vec{x}), ... f_m(\vec{x})) $$ 对于不同层上的属性或参数 x,我们加上上标 $x^{[i]}$ 表示该属性或参数属于第 i 层(第几层指示神经元计算的顺序);对于同一层的不同神经元,加上下标 $x^{[i]}_j$ 表示第 i 层的第 j 个神经元的属性或参数。...

十月 14, 2022 · 2 分钟 · 254 字 · Wokron

系统编程之 Shell 编程

一、前言 本文将简单探索shell脚本编程,介绍shell的基本语法。 二、shell简介 shell是一个命令解释器,可以用来启动、停止、编写程序;是用户和UNIX/Linux操作系统内核程序间的一个接口。 而shell编程则是将linux命令与shell的各种流程控制和条件判断来组合成命令与变量,形成可以进行自动处理的脚本程序。 三、前期准备 创建脚本 shell脚本是一个文本文件,可用文本编辑器如vi、vim编辑保存。创建shell脚本只需按照创建文本文件的方式创建。如 vi c1.sh vim c2.sh > c3.sh shell脚本一般以.sh为后缀,但没有后缀依旧可以执行。 创建的shell脚本,一定要在开头第一行加上如下语句: #!/bin/bash 这一行将指明该脚本执行所需要的命令解释器。 执行脚本 shell脚本的执行方法有 sh <scriptname> bash <scriptname> 或者使用chmod命令修改脚本为可执行,再直接使用 ./<scriptname> 运行。 四、基本语法 变量 shell中的变量分为环境变量、用户定义变量、内部变量。 其中环境变量是操作系统的一部分,但可以利用shell脚本进行修改;用户变量即在脚本中声明的变量;而内部变量则用来指示脚本运行中出现的一些变量。 声明 只有用户变量可以声明。和其他语言一样,使用等号进行声明。但要注意的是,shell脚本是弱类型的,因此变量名前不需要加上类型名。 var=hello_world 注意shell对空格敏感,声明时等号两边不能有空格 另外可以在变量名前添加 readonly关键字设为只读 readonly constVar shell中声明数组同样直接写出数组名称 arr[0]=1 arr[1]=5 arr[10]=20 未赋值的部分默认为NULL。 注意 ubuntu 默认使用 dash 而非 bash shell。dash 并不支持数组。要使用数组可以用bash运行脚本,即运行命令 bash <scriptname> 赋值 shell变量有类似左值右值的区别。在用其他变量进行赋值时,需要对变量使用${ } 进行取值。 var1=hi var2=${var1} 引号 shell脚本是为了自动化处理命令而设计的。因此语法中有很大一部分关注于字符串和命令的相关操作。在变量上体现在,shell中所有变量默认以字符串形式存在。 并且,为了满足命令处理的需要,shell设计出了引号变量值。 shell中的引号包括单引号、双引号和倒引号。 单引号中的字符均作为普通字符出现。(可以包括空格) var1=hello_world # var2=hello world # 不合法 var3='hello world' 双引号中的字符大部分作为普通字符对待。除了$\’和双引号,这些变量依旧用于对字符串内容进行变量替换。...

十月 8, 2022 · 2 分钟 · 321 字 · Wokron

机器学习笔记之正则化

一、前言——过拟合 我们知道,经过一组点可以有无数条曲线。这些曲线对于这组样本点的损失函数同为 0。但是对于预测来说,这些曲线产生的结果却并不相同。这就意味着,进行梯度下降到达某一最低点时,依旧不一定能得到“最好的”预测(拟合/分类)效果。甚至可能对于一些情况,此时的(预测/分类)效果反而更差了。这样的情况就称为过拟合。 过拟合的存在是很合理的。从感性上讲,将机器学习的过程类比人类的认知,一个观念的形成不能超出经验之外,认知的结果永远是片面而非客观的。那么在与更广泛的客观现实接触之前,我们必然无法得知已经形成的认知是否是依旧可以应用的。 这是一个很休谟的观点。但却无法解决现实问题。我们依旧需要找到减少过拟合的方法。 二、惩罚 我们的思想中存在着一种先验观念,它规范天地万物,在冥冥中告诉我们什么是“合理的”。对于机器学习模型来说也是一样的,它应当具有这样的机制,告诉它什么情况是不可能的。 就比如说,对于房价,我们知道一些特征是更加重要的,而另一些是更加不重要的。很显然,那些更重要的特征对应的权重应该较不重要的特征对应的权重大。那么我们就需要对那些不重要的权重进行“惩罚”,以避免这些权重过大,从而导致模型过拟合。这样的“惩罚”在损失函数中体现。即,当这些权重过大时,损失函数也会相应增大。 具体而言,对如下的表达式 $$ y = w_1x_1 + w_2x_2 + w_3x_3 + b $$ 假设要使第二、三个权重相对较小,则可以在损失函数中加上惩罚项 $\lambda_2 w_2 + \lambda_3 w_3$。其中 $\lambda_2, \lambda_3$ 取较大值。则损失函数变为 $$ J_{new}(\vec{w}, b) = J(\vec{w}, b) + \lambda_2 w_2 + \lambda_3 w_3 $$ 具体地比如说 $$ J_{new}(\vec{w}, b) = J(\vec{w}, b) + 1000 w_2 + 2000 w_3 $$ 那么此时很显然,当 $w_2, w_3$ 较大时,损失函数也会相应更大。 可是对于大多数情况,我们无法事先知晓权重的重要程度。对于这些一般化的问题,还需要有一般化的解决办法。 三、正则化 正则化是惩罚的一种。该方法在损失函数中增加了正则项: $$ \frac{\lambda}{2m} \sum_{j=1}^n w^2_j $$ 其中 $\lambda$ 称为正则化参数。...

十月 8, 2022 · 1 分钟 · 143 字 · Wokron

机器学习笔记之逻辑回归

一、前言——逻辑分类 机器学习研究的另一种问题为分类问题。给出一些信息,判断是或不是某种物体、属性。比如说给出病人的各项检测指标,判断其是否患病。 对于是、否的判断,这里用 1、0 表示。则训练样本就与之前的线性与多项式回归样本类似。 我们可以试着用一元线性回归来拟合分类问题的样本。 比如对于如下的样本数据 进行一元线性回归后得到 我们将数值大于 0.5 的部分看做预测为真,小于 0.5 的部分看做预测为假。可以看到,此时一元线性回归就已经可以使所有样本点符合判断结果了。 但如果我们在 x 值更大的区域增加更多的样本点,再进行回归 可以看到,有一部分应为 1 的点被分在了 y < 0.5 的部分,被预测为 0。这说明只凭线性回归无法解决分类问题。我们需要另一种回归方法。 二、逻辑回归 线性回归失效的原因在于,拟合的目标是对所有点的方差最小,在分类边界上的样本可能因为其他样本的影响而被分到另一类。而为什么会受到其他样本的影响呢?因为线性回归得到的表达式值域趋向于无穷;而样本的结果却只有 0、1。所以对于一个样本,只要它的特征数值足够大或足够小,就足以产生极大的损失。(为什么可能出现足够远的样本?因为分类问题需要划分出一个边界,在边界两侧可能存在足够大的范围。) 我们要对线性回归进行修改,需要将回归得到的表达式的值域缩小到 0 至 1 的范围。 这里引入 Sigmoid 函数 $$ S(z) = \frac{1}{1 + e^{-z}} $$ 它的图像如下 该函数定义域为 $(-\infty, +\infty)$,值域为 $(0, 1)$ 假设原本线性回归的函数为 $$ f_{\vec{w}, b}(\vec{x}) = \vec{w} \cdot \vec{x} + b $$ 则现在令 $$ f_{\vec{w}, b}(\vec{x}) = S(\vec{w} \cdot \vec{x} + b) $$ 即 $$ f_{\vec{w}, b}(\vec{x}) = \frac{1}{1 + e^{\vec{w} \cdot \vec{x} + b}} $$ 为新的函数。其中 $S(z)$ 即为 Sigmoid 函数。这样,表达式的值域就缩小为了 $(0, 1)$,从而消除了值域对损失的影响。...

十月 5, 2022 · 2 分钟 · 311 字 · Wokron

机器学习笔记之多项式回归

一、引言——拟合多项式 考虑如图所示的样本数据: 如果我们用一元线性回归去拟合该数据,会发现直线与数据点拟合效果很差。 通过观察,我们很容易得知数据点满足二次函数,具体地,函数是 $\frac{1}{2}x^2 + 5$。既然用直线 $y = wx + b$ 不能拟合,那么换用二次函数 $y = w_1x^2 + w_2x + b$ 拟合的话效果会如何? 二、多项式回归的步骤 对于一元多项式函数 $$ y = w_1x + w_2x^2 + \cdots + w_nx^n + b $$ 令 $x^i = y_i$,则原函数变为 $$ y = w_1y_1 + w_2y_2 + \cdots + w_ny_n + b $$ 对于自变量 $x$,只需将 $x^2, x^3, \cdots, x^n$ 看成与 $x$ 不同的特征。此时一个一元多项式函数的拟合问题就转变成了我们已知的多元线性拟合问题。同理,对于多元多项式函数,也可以将其转化为多元线性函数进行拟合。 三、代码实现 对于如下样本: x = np.array(range(-1, 10)) y = (x ** 2) / 2 + 5 将 $x^2$ 也作为一个特征...

十月 1, 2022 · 1 分钟 · 166 字 · Wokron

机器学习笔记之特征缩放

一、引言——参数数值对权重的影响 考虑有两个特征的房价预测。其一为房子面积,其二为卧室数量。参数的范围为 $$ x_1 \in [300, 2000] \\ x_2 \in [0, 5] $$ 预测直线为 $$ y = w_1x_1 + w_2x_2 + b $$ 从感性上认知,如果 $w_1$ 的数值大于 $w_2$,那么由特征 $x_1$ 贡献的房价就会远大于特征 $x_2$。因为这样的话,对于同等数值的变化,特征 $x_1$ 的贡献变化大于 $x_2$,而 $x_1$ 的范围又更大,则其对贡献的变化也会更加得大。这是很不合常理的。因此从感性上讲,$w_1$ 的数值应该小于 $w_2$。 另外,根据损失函数的定义 $$ J(\vec{w}, b) = \frac{1}{2m}\sum_{i=1}^{m}(\vec{w}\cdot\vec{x}^{(i)} + b - y^{(i)})^2 $$ 当损失函数值固定时,改变权重 $w_1$, 则对应的权重 $w_2$ 的变化要大于 $w_1$。从图像来说,此时损失函数形成陡峭的“山谷”,它的等高线图类似于椭圆。这时进行梯度下降,在步长较大时可能出现在“崖壁”上来回跳跃的情况。 为了避免这种情况,我们需要找到一种优化的方法。 二、特征缩放 我们要做的是避免出现不同特征的范围差距较大的情况。那么对于极差较大的特征,我们需要将其数值所在的区间范围缩小。这就是特征放缩。 在进行过特征放缩后,损失函数从图像上看将会较原来更接近正圆形,这样的话,寻找通向最低点的路径将会更加容易。 特征缩放有许多不同的方法,如: 除数特征缩放 均值归一化(Mean normalization) Z-score标准化(Z-score normalization) 除数特征缩放指的是将该特征的所有值同除以某一个数,比如说最大值。 $$ x_{scaled} = \frac{x}{x_{max}} $$ 均值归一化是以均值为参照对所有数值进行缩放,公式: $$ x_{scaled} = \frac{x - x_{mean}}{x_{max} - x_{min}} $$ Z-score标准化将数值转换为正态分布。公式: $$ x_{scaled} = \frac{x - \mu}{\sigma} $$ 其中 $$ \mu = \frac{1}{m}\sum_{i = 1}^m x^{(i)} \\ \sigma^2 = \frac{1}{m}\sum_{i = 1}^m (x^{(i)} - \mu)^2 $$ 三、代码实现 利用 Z-score 标准化对特征进行缩放...

十月 1, 2022 · 1 分钟 · 175 字 · Wokron