之前,论智曾在top 10:初学者需要掌握的10大机器学习(ml)算法介绍了一些基础算法及其思路,为了与该帖联动,我们特从机器学习热门课程hse的introduction to deep learning和吴恩达的neural networks and deep learning中挑选了一些题目,演示python、tensorflow和keras在深度学习中的实战应用.
如何建立一个线性分类器并进行优化.
在这个任务中,我们将实现一个线性分类器,并用numpy和随机梯度下降算法对它进行训练。
二元分类
为了更直观,我们用人造数据(synthetic data)解决二元分类问题。
上图中有红、蓝两类数据,从分布上看它们不是线性可分的。所以为了分类,我们应该在里面添加特征或使用非线性模型。请注意,图中两类数据的决策边缘都呈圆形,这意味着我们能通过建立二元特征来使它们线性分离,具体思路如下图所示:
用expand函数添加二次函数后,我们得到了这样的测试结果:
# 简单的随机数测试
dummy_x = np.array([
[0,0],
[1,0],
[2.61,-1.28],
[-0.59,2.1]
])
# 调用expand函数
dummy_expanded = expand(dummy_x)
# 它应该返回这些值: x0 x1 x0^2 x1^2 x0*x1 1
dummy_expanded_ans = np.array([[0. , 0. , 0. , 0. , 0. , 1. ],
[1. , 0. , 1. , 0. , 0. , 1. ],
[2.61, -1.28, 6.8121, 1.6384, -3.3408, 1. ],
[-0.59, 2.1 , 0.3481, 4.41, -1.239, 1. ]])
logistic回归
曾经我们提到过,logistic回归非常适合二元分类问题。为了分类对象,我们需要预测对象表示为1(默认类)的概率,这就需要用到线性模型和逻辑函数的输出:
defprobability(x, w):
对输入赋值特征和权值
根据上式,返回输入x后y==1的预测概率,p(y=1|x)
:参数 x: feature matrix x of shape [n_samples,6] (expanded) →特征矩阵x
:参数 w: weight vector w of shape [6] for each of the expanded features →权值向量w
:返回值: 范围在 [0,1] 之间的一系列概率.
return1./ (1+ np.exp(-np.dot(x, w)))
在logistic回归中,我们能通过最小化交叉熵发现最优参数w:
defcompute_loss(x, y, w):
将特征矩阵x [n_samples,6], 目标向量 [n_samples] of 1/0,
以及权值向量 w [6]代入上述公式, 计算标量的损失函数.
return-np.mean(y*np.log(probability(x, w)) + (1-y)*np.log(1-probability(x, w)))
由于用了梯度下降算法训练模型,我们还需要计算梯度,具体来说,就是要对每个权值的损失函数求导:
以下是具体的数学计算过程(也可点击https://math.stackexchange.com/questions/477207/derivative-of-cost-function-for-logistic-regression/2539508#2539508查看):
defcompute_grad(x, y, w):
将特征矩阵x [n_samples,6], 目标向量 [n_samples] of 1/0,
以及权值向量 w [6]代入上述公式, 计算每个权值的导数vector [6].
returnnp.dot((probability(x, w) - y), x) / x.shape[0]
训练
现在我们已经建立了函数,接下来就该用随机梯度下降训练分类器了。我们将试着调试超参数,如batch size、学习率等,来获得最佳设置。
mini-batch sgd
不同于满梯度下降,随机梯度下降在每次迭代中只需要一个随机样本来计算其损失的梯度,并进入下一个步骤:
w = np.array([0,0,0,0,0,1])# 初始化
eta =0.05# 学习率
n_iter =100
batch_size =4
loss = np.zeros(n_iter)
foriinrange(n_iter):
ind = np.random.choice(x_expanded.shape[0], batch_size)
loss[i] = compute_loss(x_expanded, y, w)
dw = compute_grad(x_expanded[ind, :], y[ind], w)
w = w - eta*dw
下图展示了当batch size=4时,决策面(decision surface)和交叉熵损失函数如何随着不同batch的sgd发生变化。
左:决策面;右:损失函数
用momentum优化sgd
momentum是模拟物理里动量的概念,如下图所示,它能在相关方向加速sgd,抑制振荡,从而加快收敛。从计算角度说,就是对上一步骤更新向量和当前更新向量做加权平均,将其用于当前计算。
eta =0.05# 学习率
alpha =0.9# momentum
nu = np.zeros_like(w)
n_iter =100
batch_size =4
loss = np.zeros(n_iter)
foriinrange(n_iter):
ind = np.random.choice(x_expanded.shape[0], batch_size)
loss[i] = compute_loss(x_expanded, y, w)
dw = compute_grad(x_expanded[ind, :], y[ind], w)
nu = alpha*nu + eta*dw
w = w - nu
下图展示了引入momentum后,当batch size=4时相应决策面和交叉熵损失函数随不同batch sgd+momentum发生的变化。可以看出,损失函数下降速度明显加快,更快收敛。
左:决策面;右:损失函数
rmsprop
加快收敛速度后,之后我们要做的是调整超参数学习率,这里我们介绍hinton老爷子的rmsprop。这是一种十分高效的算法,利用梯度的平方来调整学习率:
eta =0.05# 学习率
alpha =0.9# momentum
g = np.zeros_like(w)
eps =1e-8
n_iter =100
batch_size =4
loss = np.zeros(n_iter)
foriinrange(n_iter):
ind = np.random.choice(x_expanded.shape[0], batch_size)
loss[i] = compute_loss(x_expanded, y, w)
dw = compute_grad(x_expanded[ind, :], y[ind], w)
g = alpha*g + (1-alpha)*dw**2
w = w - eta*dw / np.sqrt(g + eps)
下图是使用了sgd + rmsprop后决策面和损失函数的变化情况,较之之前,函数下降更快,收敛也更快。
国内种植体表面酸蚀工艺与设备的现状
光热发电产品及系统
在消费升级的背景之下 智能家居成为了不少家电企业共同的选择
工程师,是什么扼杀了你的研发成果?
【新闻中心】法国Solu-Watt公司客户来安科瑞考察洽谈业务
实例:如何建立一个线性分类器并进行优化
vivoNEX的续航和游戏性能到底有多强
iPhone7红色特别版开箱图赏:iPhone一直都很美 这次很“骚”
数字黄金为什么能在众多的数字货币中脱颖而出
为何要支持国产PLC厂子?
苹果成功的幕后功臣
美国司法部宣布对福建晋华和台湾联电提起诉讼
华为Mate10什么时候上市?华为Mate10最新消息:华为Mate9、华为P10官网降价处理,只为迎接华为Mate10?
预计新能源汽车将带动汽车电子市场持续增长
启明智显智能猫眼门铃方案,带来全方位体验升级
物体识别触摸桌在展厅中的应用优势
CCTVdirect发布VueNet摄像机测试仪,搭配五英寸触摸屏
三位三通电磁阀基本结构及工作原理
ST副总裁再次当选EPoSS欧洲智能系统整合平台联盟主席
Microchip推出首款多端口千兆位PoE供电器,简化Wi-Fi® 6接入点和小基站节点部署