python sigmod函数数在哪里变化最快

开发(71)
sigmod_layer.hpp
#ifndef CAFFE_SIGMOID_LAYER_HPP_
#define CAFFE_SIGMOID_LAYER_HPP_
#include &vector&
#include &caffe/blob.hpp&
#include &caffe/layer.hpp&
#include &caffe/proto/caffe.pb.h&
#include &caffe/layers/neuron_layer.hpp&
namespace caffe {
* @brief Sigmoid function non-linearity @f$
y = (1 + \exp(-x))^{-1}
@f$, a classic choice in neural networks.
* Note that the gradient vanishes as the values move away from 0.
* The ReLULayer is often a better choice for this reason.
template &typename Dtype&
class SigmoidLayer : public NeuronLayer&Dtype& {
explicit SigmoidLayer(const LayerParameter& param)
: NeuronLayer&Dtype&(param) {}
virtual inline const char* type() const { return &Sigmoid&; }
protected:
* @param bottom input Blob vector (length 1)
-# @f$ (N \times C \times H \times W) @f$
the inputs @f$ x @f$
* @param top output Blob vector (length 1)
-# @f$ (N \times C \times H \times W) @f$
the computed outputs @f$
y = (1 + \exp(-x))^{-1}
virtual void Forward_cpu(const vector&Blob&Dtype&*&& bottom,
const vector&Blob&Dtype&*&& top);
virtual void Forward_gpu(const vector&Blob&Dtype&*&& bottom,
const vector&Blob&Dtype&*&& top);
* @brief Computes the error gradient w.r.t. the sigmoid inputs.
* @param top output Blob vector (length 1), providing the error gradient with
respect to the outputs
-# @f$ (N \times C \times H \times W) @f$
containing error gradients @f$ \frac{\partial E}{\partial y} @f$
with respect to computed outputs @f$ y @f$
* @param propagate_down see Layer::Backward.
* @param bottom input Blob vector (length 1)
-# @f$ (N \times C \times H \times W) @f$
the inputs @f$ x @f$; Backward fills their diff with
gradients @f$
\frac{\partial E}{\partial x}
= \frac{\partial E}{\partial y} y (1 - y)
@f$ if propagate_down[0]
virtual void Backward_cpu(const vector&Blob&Dtype&*&& top,
const vector&bool&& propagate_down, const vector&Blob&Dtype&*&& bottom);
virtual void Backward_gpu(const vector&Blob&Dtype&*&& top,
const vector&bool&& propagate_down, const vector&Blob&Dtype&*&& bottom);
// namespace caffe
// CAFFE_SIGMOID_LAYER_HPP_
sigmod_layer.cpp
#include &cmath&
#include &vector&
#include &caffe/layers/sigmoid_layer.hpp&
namespace caffe {
template &typename Dtype&
inline Dtype sigmoid(Dtype x) {
return 1. / (1. + exp(-x));
template &typename Dtype&
void SigmoidLayer&Dtype&::Forward_cpu(const vector&Blob&Dtype&*&& bottom,
const vector&Blob&Dtype&*&& top) {
const Dtype* bottom_data = bottom[0]-&cpu_data();
Dtype* top_data = top[0]-&mutable_cpu_data();
const int count = bottom[0]-&count();
for (int i = 0; i & ++i) {
top_data[i] = sigmoid(bottom_data[i]);
template &typename Dtype&
void SigmoidLayer&Dtype&::Backward_cpu(const vector&Blob&Dtype&*&& top,
const vector&bool&& propagate_down,
const vector&Blob&Dtype&*&& bottom) {
if (propagate_down[0]) {
const Dtype* top_data = top[0]-&cpu_data();
const Dtype* top_diff = top[0]-&cpu_diff();
Dtype* bottom_diff = bottom[0]-&mutable_cpu_diff();
const int count = bottom[0]-&count();
for (int i = 0; i & ++i) {
const Dtype sigmoid_x = top_data[i];
bottom_diff[i] = top_diff[i] * sigmoid_x * (1. - sigmoid_x);
#ifdef CPU_ONLY
STUB_GPU(SigmoidLayer);
INSTANTIATE_CLASS(SigmoidLayer);
// namespace caffe
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:26305次
排名:千里之外
原创:44篇
转载:53篇
(3)(1)(4)(1)(12)(9)(2)(2)(1)(18)(2)(6)(3)(1)(4)(10)(13)(5)(1)(1)(2)(1)之前写的一篇感觉太 Naive ,这里重新写一篇作为总结。Logistic 与 Softmax 都是一种概率判别模型(PRML p203),Softmax 通常用在 Neural Network 里最后全连接层 ,Logistic 在业界更是普及,因为简单有效、便于并行、计算量小快,适合大规模数据等优点,而且采用 SGD 的 Logistic 相当于直接 Online Learning ,非常方便。本文将对两个模型展开详细介绍,从 exponential family 到 parallel 等都会涉及。 Sigmod Function Logistic Regression 是用来处理二分类问题的,它与一个函数密切相关,即 sigmod 函数: \[h(z)& = \frac{ e^z}{1+ e^z}= \frac{ 1}{1+ e^{-z}} \] 通过 sigmod 函数可以将函数值映射到 $(0,1)$ 区间,这里 $h$ 即代表了 sigmod 函数,其图形如下: Logistic Regression 正是在线性回归的基础上加了 sigmod 而得到的 对数几率比解释 线性回归中,值域落在 $(-\infty,+\infty)$,然而对于二分类来说只需两种取值 0、1 即可,线性回归中事件发生的几率用 $\frac{p}{1-p}$ 表示的话,其值域为 $[0,\infty)$ ,然而二分类中模型取值落在 $[0,1]$ 之间,还需要满足的是 $w^Tx$ 越大,则事件发生的几率越大,所以使用对数几率比即可: \[\log odds =\log \frac{z}{1-z}\] 与线性模型对应可得: \[\log \frac{z}{1- z} = w^Tx\] 综上便得到了 Logistic Regression 的模型, $z$ 便为模型的输出: \[ z = \frac{e^{w^Tx}}{1+e^{w^Tx}} = \frac{1}{1+e^{-w^Tx}} \] Generalized Liner Model 解释 从概率概率判别模型的角度来讲,Logistic Regression 是一种广义线性模型。所以需要注意给定自变量 $X$ 之后因变量 $Y$ 的条件期望值 $E(Y|X;w)$ 与变量 $X$ 之间的关系,这个对应关系便为所求解的模型,假设 $y \sim Bernoulli(z)$ ,同时 $y \sim ExponentialFamily(\eta)$,只需把 Bernoulli 化成 exponential family 的形式便可得到 $z$ 与 $\eta$ 的对应关系,这里直接给出结果,具体参考
: \[ P(Y =1|X = x) = E[y|x;w] = z = \frac{1}{1+e^{-\eta}} = \frac{1}{1+e^{-w \cdot x}} \] 可见以上两种解释方式都得到了对 $x$ 的线性组合 $w^T \cdot x$ 做 sigmod 映射的形式,这边是模型的假设函数,接下来便可根据假设函数建立损失函数,并且进行参数估计与模型的求解.
参数估计 接下来需要对参数 $w$ 进行估计,方法很多,极大似然估计MLE ,负log损失或者叫做交叉熵损失,先看 MLE ,给定数据集 $\left\{(x_i,y_i)\right\}_{i=1}^N$ ,写出其似然函数 : \[\prod_ip(y_i|x_i;z_i) = \prod_iz_i^{y_i}(1-z_i)^{1-y_i}\] 其中 $z_i = \frac{1}{1+e^{-w^T x_i}}$,转换为对数似然形式,最终只需极大化以下似然函数即可:
\[L(w) = \sum_iy_ilogz_i+(1-y_i)log(1-z_i)\] &
这里来看另一种方法,即用负 log 损失函数来推导出 logistic 的损失函数,负log损失定义为: $L(y,P(Y|X)) = –logP(Y|X)$ ,根\[L(y,P(Y|X)) = \left\{ \begin{aligned}-logP(Y=1|X=x), \ y=1 \\-logP(Y=0|X=x), \ y = 0\end{aligned}\right.\] 据
$P(Y= 1| X=x) =z$ 与 $P(Y= 0| X =x) = 1-z$ 写成紧凑的形式:$L(y,z)=-ylogz-(1-y)log(1-z)$. &
可以看到当$y = 1$时,$z$ 越接近 1 损失越小,当 $y = 0$ 时 , $z$ 越接近 1 损失越大,现在对于整个数据集可得: \[ L(w) = -\sum_i[y_ilogz_i + (1-y_i)log(1-z_i)] \]
可见极大似然 MLE 正好等于极小化负 log 损失,因此两者是等价的,交叉熵在 2 分类下就是负 log 损失,所以交叉熵在 softmax 里会提到. 得到损失函数之后,为了防止过拟合,当然需要加上正则项了,这里以 $L_2$ 正则为例,加上正则后需要极小化的损失为: \[ L(w) = –\sum_i[y_iz_i+(1-y_i)(1-z_i)]+& \frac{\lambda}{2}||w||^2\]
接下来直接使用梯度下降的来对 $w$ 进行更新: \[w:= w – \frac{\partial L(w)}{\partial w}\] 这里对损失函数求导可以得到: \begin{aligned}\frac{\partial L(w) }{\partial w}& = \frac{\partial& -\sum_i[y_ilogz_i+(1-y_i)log(1-z_i)] + \frac{\lambda}{2}||w||^2 }{ \partial w}\\&=-\sum_i[y_i\frac{1}{z_i}+(1-y_i)\frac{1}{1-z_i}][z_i(1-z_i)]\frac{\partial w \cdot x_i}{ \partial w} +\lambda w \\&= -\sum_i[y_i(1-z_i)-(1-y_i)z_i] \frac{\partial w \cdot x_i}{ \partial w}+ \lambda w \\&= \sum_i(z_i -y_i) x_i + \lambda w \\\end{aligned} 给出学习速率 $\alpha$ ,最终得到带有正则项的 Logistic Regression 回归的梯度下降算法:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& $while$ $iter & iter\_num$ $do$ : \[w:= w – \alpha \left [\sum_i(z_i -y_i) x_i +\lambda w \right ]\] Softmax Regression Softmax Regression 即为一个 K 分类的概率判别模型,就是把 Logistic Regression 推广到 K 分类的版本,把样本 $x$ 属于类别 $k$ 的概率用 $z_k$ 表示,即 $z_k = P(Y = k| X = x)$ ,可以得到 Softmax 的假设函数如下: \[\left[ \begin{aligned}z_1 \\z_2 \\ ...\\z_K \end{aligned}\right]=\frac{1}{\sum_{j=1}^Ke^{w_j^Tx}}\left[ \begin{aligned}e^{w_1^Tx} \\e^{w_2^Tx} \\ ...\\e^{w_K^Tx} \end{aligned}\right]\] 建立 Softmax 模型的步骤是给定训练数据集 $\left\{(x_i,y_i)\right\}_{i=1}^N$ ,这里 $y_i \in& \mathbb{R}^K$ ,假设 $x_i$ 属于类别 $k$ ,则 $y_i$ 的第 $k$ 维为 1 ,其余维度为 0 。Softmax 其实就是 Logistic 的多分类的推广,这里的变量 $Y$ 是服从多项分布的,所以可以通过多项分布极大似然的方式来推导出 Softmax 。 Softmax& 参数估计 首先来个单个样本的损失,对于单个服从多项分布的样本,其似然函数为 $\prod_kz_k^{y_k}$ , 极大化该似然函数正好等于极小化以下交叉熵损失: \[L(w) = -\sum_k& y_k \log z_k& \] \[z_k = \frac{e^{w_k^Tx}}{\sum_je^{w_j^Tx}}\] 这里同样需要对损失函数 $L(W)$ 求导,注意这里 $W$ 采用大写,是因为 $W$ 为矩阵,其形式为 $[w_1,w_2,…,w_K]$,因为每个类别需要一组参数,求导前要明确 $z_k$ 对 $w_i$ 与 $w_k$ 的导数: \begin{aligned} \frac{\partial z_{k} }{\partial w_i} &= -y_k \cdot y_i \\\frac{\partial z_{k} }{\partial w_k} &= y_k \cdot (1-y_k) \\\end{aligned}
这里代表对 $w_k$ 求导代表 $i =k$ 时求导;对 $w_i$ 求导代表对 $i \ne k$ 求导,两个结果是不一样的。首先是 $z_k$ 对 $w_k$ 的导数: \begin{aligned} \frac{\partial z_{k} }{\partial w_k} &= \frac{\partial }{\partial w_k}\left ( \frac{e^{w_{k}x}}{\sum_je^{ w_{j}x} }\right) \\&= [e^{w_{k}x}]_{w_k'}\frac{1}{\sum_je^{ w_{j}x} }+e^{w_{k}x}\left [\frac{1}{\sum_je^{ w_{j}x} }& \right ]_{w_k'}\\&= \frac{\partial w_kx}{\partial w_k}\frac{e^{w_{k}x}}{\sum_je^{ w_{j}x} }-e^{w_{k}x}\frac{e^{w_{k}x}}{\left (\sum_je^{ w_{j}x}& \right )^2}\frac{\partial w_kx}{\partial w_k}\\&=\frac{e^{w_{k}x}}{\sum_je^{ w_{j}x} } \cdot x - \left (\frac{e^{w_{k}x}}{\sum_je^{ w_{j}x}& }\right )^2 \cdot x \\&= z_k(1-z_k)\cdot x\end{aligned} 接下来是 $z_k$ 对 $w_i$ 的导数: \begin{aligned} \frac{\partial z_{k} }{\partial w_i}&= \frac{\partial }{\partial w_i}\left ( \frac{e^{w_{k}x}}{\sum_je^{ w_{j}x} }\right) \\&= -\frac{e^{w_{k}x}}{\left ( \sum_je^{ w_{j}x} \right)^2 }& \frac{\partial \sum_je^{ w_{j}x} }{\partial w_i} \\&=-\frac{e^{w_{k}x}& }{\sum_je^{ w_{j}x}& } \cdot \frac{ e^{w_{i}x} }{ \sum_je^{ w_{j}x} }\cdot \frac{\partial w_ix}{\partial w_i} \\ &=-z_k z_i \cdot x\end{aligned} 因此单个样本损失函数对权重 $w_j$ 求损失,可得: \begin{aligned} \frac{\partial \left [-\sum_k y_k \log z_k& \right ] }{\partial w_j} &= -\sum_ky_k \cdot \frac{\partial \log z_k}{\partial w_j} \\&= -\sum_ky_k \frac{1}{z_k} \frac{\partial z_k}{\partial w_j} \\ &= -y_j\frac{1}{z_j}z_j(1-z_j)x - \sum_{k \ne j} y_k \frac{1}{z_k}(-z_j z_k)x \\ &= \left (-y_j +y_jz_j+& \sum_{k \ne j}& y_kz_j& \right ) \cdot x \\&= \left (-y_j + z_j\sum_ky_k& \right )\cdot x \\&=\left (z_j-y_j&& \right )\cdot x\end{aligned} 得到单个样本的导数之后,接下来结算对于整个训练集 $\left \{(x_i,y_i) \right \}_{i=1}^N$ 的导数,这里记 $y_{ik}$ 为第 $i$ 个样本标签向量的第 $k$ 维度;$z_{ik}$ 代表样本 $x_i$ 属于类别 $k$ 的概率,即 $z_{ik} = P(Y= k | X=x_i)$ ,终可得带有 $L_2$ 正则的损失函数为: \[L(W) = -\sum_i\sum_k y_{ik} \log z_{ik} + \frac{1}{2} \lambda ||W||^2\] 接下来对权重 $w_k$ 求导,可得: \[ \frac{\partial L(W)}{\partial& w_k} = \sum_i ( z_{ik}- y_{ik})x_i + \lambda w_k& \] 综上,给出带有 $L_2$ 正则的 Softmax Regression 的算法:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& $while$ $iter & iter\_num$ $do$: &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& $for$ $k=1 …K$: \[ w_k := w_k -\sum_i (z_{ik} -y_{ik}) \cdot x_i +& \lambda w_k \] 并行化 Logistic 工业界使用 Logistic 一般都是大规模数据,超级高的维度,所以有必要对 Logistic 进行并行化处理,以下给出三种并行方式: 1) data parallelism ,适用于维度适中的样本,分别把数据发送到各个节点,每个节点运行各自的 SGD ,等所有节点运行完成后将结果取平均汇总,若没达到收敛条件,则进行下一次迭代,伪代码如下:
2) data parallelism ,数据分发到各个节点,并获取当前时刻最新的参数 $\theta^t$ ,各个计算完 $\Delta \theta$ 之后(下图中的 $temp^{(i)}$ ),将 $\Delta \theta$ 汇总,用于计算 $\theta^{t+1} = \theta^t - \alpha \sum \Delta \theta$,伪码如下:
3)将 data parallelism 与 model parallelism 结合,因为 Logistic Regression& 中特征的维度通常很高,单机不一定能完成梯度计算,所以有了 Google 实现了一个 DistBelief ,采用 Parameter Server 来同步参数,异步运行,速度杠杠的,这里的 Model Replicas 是一个 Logistic Regression 模型,由几个计算节点组成,如下图所示:
模型的几个主要特点,以下这些特点虽然有些缺乏理论基础,但最后得到的模型效果是相当好的: 1)通过一个共享的 Parameter Server 来共享参数,每次处理一个 Mini-Batch 之前,从 Parameter Server 获取当前的参数 $w$,求得其导数 $\Delta w$ ,并推送到 Parameter Server 进行更新; 2) Model Replicas 是异步执行的,所以省去了同步的时间; 3)每 $n_{fetch}$ 次Mini-Batch 向服务器取一次参数,每 $n_{push}$ 次 Mini –Batch 操作推送一次结果, $n_{fetch}$ 不一定等于 $n_{push}$; 4)一个 Model Replicas& 失效,其他的 Model Replicas 仍可以运行,所以鲁棒性很强; 5)每个 Model Replicas 中的节点只需和 Parameter Server& 中和该节点有关的模型参数的那部分节点进行通信; 6)每个 Model Replicas 中的 fetch compute push 操作是通过三个线程完成的,类似于流水线机制,大大加快了速度; 7)参数服务器的每个节点更新参数的次数不一定相同,有一定的随机性. 总结 基础好不够扎实,缺乏实践经验,对& MaxEnt 与 Logistic 的关系 与 GLM 理解的不够好,暂时告一段落.有机会继续深入. & 参考文献:
Google paper: Large Scale Distributed Deep Networks 书籍: PRML ,MLAPP,统计学习方法
有一个应用可以参考一下
为什么选用 sigmod 和最大熵的关系
softmax 与 maxent 的等价证明
阅读(...) 评论()【机器学习】Logistic Regression 学习笔记 - 各各他 - 博客园
随笔 - 49, 文章 - 2, 评论 - 0, 引用 - 0
逻辑回归模型
虽然逻辑回归姓&回归,不过其实它的真实身份是二分类器。介绍完了姓,我们来介绍一下它的名字,逻辑斯蒂。这个名字来源于逻辑斯蒂分布:
逻辑斯蒂分布
设X是连续随机变量,X服从逻辑斯蒂分布是指X具有下列的分布函数和密度函数:&
上式中,&&表示位置参数,&&0&为形状参数。
有没有发现F(x)是啥?有图你就知道真相了:
有没有发现右边很熟悉?没错,就是sigmoid&曲线,这个曲线是以点(&&, 0.5) 为中心对称。从图中可以看出,曲线在中心附近增长速度较快,而形状参数&&&值越小,曲线在中心附近增长越快,请自行脑补一下。
&sigmoid曲线有几个特性:
1.x趋向正无穷时F(x)趋近于1
2.x趋向负无穷时F(x)趋近于0
3.x在0处为0.5
它的这些特性,决定它非常适合用于当作基于概率的二项分类函数。类似的还有正态分布的分布函数,和它非常类似,如果选用正态分布,则是贝叶斯逻辑回归(Bayesian logistic regression)。
  逻辑斯谛回归的采用的是最大似然估计的思想。对于给定的训练数据集T = {(x1, y1),(x2, y2),......(xn, yn)},我们找到它的似然函数(即它发生的概率),如果能使似然函数取得最大值,那么就是让这个样本发生的概率最大(这个概率是个联合概率)。
我们看一下逻辑回归的似然函数。
L(w)取得极大值,则需要yi为1时,P(Y = 1 | x)尽量的大,yi为0时,P(Y = 1 | x)尽量的小。
我们的概率函数P(Y = 1 | x)为
P (Y = 1 | x) 为sigmod函数(等价形式),为了使yi为1时,P(Y = 1 | x)尽量的大,yi为0时,P(Y = 1 | x)尽量的小。我们需要调整w&x,使得yi 为1时,w&x尽量取比较大的值,位于原点右侧较远的地方,yi为0时,w&x尽量位于原点左侧较远的地方,即它发生的概率尽量小。换句话说,我们调整w&x使得yi为1尽量发生,为0尽量不要发生。这个时候似然函数取得最大值
借用andrew ng老师的图
我们要找到w&x = 0 这条曲线,使得样本x尽量被分成两部分,一类发生的概率尽量大,另一类概率尽量小。样本点与w&x = 0 的距离,即误差,服从逻辑斯谛分布。
二项逻辑回归模型
一个事件的几率(odds):指该事件发生与不发生的概率比值,若事件发生概率为p,那么事件发生的几率就是
那么该事件的对数几率(log odds或者logit)就是:&
logit(p)=logp1&p
那么,对逻辑回归而言,Y=1的对数几率就是:&
logP(Y=1|x)1&P(Y=1|x)=w&x
也就是说,输出Y=1的对数几率是由输入x的线性函数表示的模型,这就是&逻辑回归模型。当&w&x的值越接近正无穷,P(Y=1|x)&概率值也就越接近1.
模型的数学形式确定后,剩下就是如何去求解模型中的参数。在统计学中,常常使用极大似然估计法来求解,即找到一组参数,使得在这组参数下,我们的数据的似然度(概率)最大。
P(Y=1|x)=&(x),P(Y=0|x)=1&&(x)
似然函数:
L(w)=&[&(xi)]yi[1&&(xi)]1&yi
对数似然函数:
lnL(w)=&[yiln&(xi)+(1&yi)ln(1&&(xi))]
=&[yiln&(xi)1&&(xi)+ln(1&&(xi))]
=&[yi(w&xi)&ln(1+ew&xi)]
现在要求&w&使得L(w)&最大,有的人可能会有疑问:
在机器学习领域,我们更经常遇到的是损失函数的概念,其衡量的是模型预测错误的程度。常用的损失函数有0-1损失,log损失,hinge损失等。通常是最小化损失函数,这里为啥求极大似然估计?
实际上,对数似然损失在单个数据点上的定义为:&
&ylnp(y|x)&(1&y)ln[1&p(y|x)]=&[yiln&(xi)+(1&yi)ln(1&&(xi))]
如果取整个数据集上的平均对数似然损失,我们恰好可以得到:&
J(w)=&1NlnL(w)
即在逻辑回归模型中,我们最大化似然函数和最小化对数似然损失函数实际上是等价的。
接下来就是对L(w)求极大值(也可认为是求J(w)的最小值),得到w的估计值。逻辑回归学习中通常采用的方法是梯度下降法&和&牛顿法。
[先跑个题],讲到求极值的方法,突然想到有几个可视化的gif图,能够很直观地体现各种算法的优劣,好东西当然要分享了。
&网友通过可视化方法,对比了SGD, momentum, Nesterov, AdaGrad, AdaDelta,&RMSProp等优化算法在Long Valley, Beale&s Function及Saddle Point情况下的性质。
Long Valley:&
Beale&s Function:
Saddle Point:
以后会专门写一篇来讲求极值的方法,这是题外话了,我们还是继续回归逻辑吧,哈哈。&下面介绍使用梯度下降法来求解逻辑回归问题。
使用梯度下降法(Gradient Descent)求解逻辑回归
算法(梯度下降法求解逻辑回归)&输入:目标函数:J(w)(对数似然损失函数),梯度函数:&g(w)=&J(w), 计算精度?&输出:J(w)&的极小值点&w&&过程:&(1)&取初始值&w0&Rn, 令k=0&(2)&计算J(wk)&
J(wk)=&1NlnL(wk)&rA&lnL(wk)
=&[yi(wk&xi)&ln(1+ewk&xi)]
(3)&计算梯度&gk=g(wk)=&J(w)&
g(wk)=&[xi&yi&xi&ewk&xi1+ewk&xi]
=&[xi&yi&&(xi)]
若||gk||&?&,停止迭代,令
否则,令pk=&g(wk),求&k,使得
J(wk+&kpk)=min(J(wk+&pk))
(4)&令wk+1=wk+&kpk,计算&J(wk+1)&当||J(wk+1)&J(wk)||&?&或&||wk+1&wk||&?,停止迭代,令
(5)&否则,令k=k+1,转(3).
逻辑回归的正则化
当模型的参数过多时,很容易遇到过拟合的问题。而正则化是结构风险最小化的一种实现方式,通过在经验风险上加一个正则化项,来惩罚过大的参数来防止过拟合。
正则化是符合奥卡姆剃刀(Occam&s razor)原理的:在所有可能选择的模型中,能够很好地解释已知数据并且十分简单的才是最好的模型。
我们来看一下underfitting,fitting跟overfitting的情况:
显然,最右这张图overfitting了,原因可能是能影响结果的参数太多了。典型的做法在优化目标中加入正则项,通过惩罚过大的参数来防止过拟合:&
J(w)=&J(w)+&||w||p
p=1或者2,表示L1&范数和&L2范数,这两者还是有不同效果的。
L1范数:是指向量中各个元素绝对值之和,也有个美称叫&稀疏规则算子&(Lasso regularization)。那么,参数稀疏&有什么好处呢?
L2范数:它有两个美称,在回归里面,有人把有它的回归叫&岭回归&(Ridge Regression),有人也叫它&权值衰减&(weight decay)。
接下来我们思考一下为什么L1范式会产生稀疏性。
假设代价函数 L 与某个参数 x 的关系如图所示:
则最优的 x 在绿点处,x 非零。现在施加 L2 regularization,新的代价函数()如图中蓝线所示:
施加L2范式的实质是在原来函数曲线上上移一个抛物线的位移,虽然抛物线在0处取得最小值,但是抛物线在0处过于平缓。最优的 x 在黄点处,x 的绝对值减小了,但依然非零。而如果施加 L1 regularization,则新的代价函数()如图中粉线所示:
施加L1范式的实质是在原来函数曲线上上移一个V形折线的位移,折线在0处取得最小值,只要系数C足够大,就能够使得代价函数在0处取得最小值。最优的 x 就变成了 0。这里利用的就是绝对值函数(L1)的尖峰。两种 regularization 能不能把最优的 x 变成 0,取决于原先的费用函数在 0 点处的导数。如果本来导数不为 0,那么施加 L2 regularization 后导数依然不为 0,最优的 x 也不会变成 0。而施加 L1 regularization 时,只要 regularization 项的系数 C 大于原先费用函数在 0 点处的导数的绝对值,x = 0 就会变成一个极小值点。上面只分析了一个参数 x。事实上 L1 regularization 会使得许多参数的最优值变成 0,这样模型就稀疏了。1177人阅读
机器学习(29)
首先声明:本博客的写作思路是对机器学习的一些基本算法做一些通俗性的灵活理解,以及对一些细节的进行简单剖析,还有记录本人在使用算法时的一些小经验小感想。本人一般不会对基本公式做大量推导,也不会写的太正式,这些可以在很多其他博客中找到。由于本人还是学生一枚,经验知识粗浅,还望能和朋友们参与讨论。
之前本博客简单谈过相关知识点,这次来谈一下逻辑斯蒂回归。虽然也叫回归,但是逻辑斯蒂回归是一种分类算法。它合理地应用了线性回归的优势来完成分类任务,是一种应用非常广泛的分类算法。
那么,逻辑斯蒂回归是如何完成分类任务的呢?
第一个理解角度:线性回归用于分类任务的拓展
我们知道,线性回归之所以功能强大,离不开它能将输入数据的各个维度的特征进行了有效的结合(通过分配不同的权重),使得所有特征共同协同合作作出最后的决策。但是,作出的决策是对模型的一个拟合结果,不能直接用于分类。于是,逻辑斯蒂回归使用了一个sigmod函数,将特征的线性加权结果映射到0到1之间,而这刚好可以看做是数据样本点属于某一类的概率。如果结果越接近0或者1,说明分类结果的可信度越高。
这里需要注意的一点是,逻辑斯蒂回归不仅可以处理数据线性可分的情况,还可以处理数据线性不可分的情况。当线性加权的各个特征不是简单的线性函数而是非线性函数的时候,分割面就不是一个超平面而是一个曲线或者曲面。这种情况一图以明之:
还有一个理解角度是:基于逻辑斯蒂分布的二项逻辑斯蒂回归模型
这个角度的好处是可以将逻辑斯蒂回归模型的二分类问题轻松扩展到多分类问题。二项逻辑斯蒂回归模型是一种分类模型,由条件概率分布P(Y|X)表示,形式为参数化的逻辑斯蒂分布(关于逻辑斯蒂分布以及概率分布的基础知识请看本文附录)。这里,随机变量X取值为实数,随机变量Y取值为1或0。二项逻辑斯蒂回归模型是如下的条件概率分布:
对于给定的输入实例x,按照上式可以求得P(Y=1|x)和P(Y=0|x)。逻辑斯蒂回归比较两个条件概率值的大小,将实例x分到概率值较大的那一类。
现在我们要引入一个叫做“事件的几率”这个概念。一个事件的几率是指该事件发生的概率与该事件不发生的概率的比值。如果事件发生的概率是p,那么该事件的几率是p/(1-p),该事件的对数几率或logit函数是:logit(p)=log( p/(1-p) ) 。对逻辑斯蒂回归而言,由上面表达式得:
这就是说,在逻辑斯蒂回归模型中,输出Y=1的对数几率是输入x的线性函数。或者说,输出Y=1的对数几率是由输入x的线性函数表示的模型,即逻辑斯蒂回归模型。
多项逻辑斯蒂回归
上面说到第二种角度可以轻松扩展到多分类,叫做多项逻辑斯蒂回归模型,我们现在来看一下。假设离散型随机变量Y的取值集合是{1,2,…K},那么多项逻辑斯蒂回归模型是:
对于参数估计方法仍然可以采用二分类时候的最大似然估计,后面再讲。
逻辑斯蒂回归适合应用在什么场景?
在我们的工业应用上,如果需要作出分类的数据拥有很多有意义的特征,每个特征(我们假设这些特征都是有效的)都对最后的分类结果又或多或少的影响,那么最简单最有效的办法就是将这些特征线性加权,一起参与到作出决策的过程中。比如预测广告的点击率,又比如从原始数据集中筛选出符合某种要求的有用的子数据集。
逻辑斯蒂回归还有一个优点,那就是它不是硬性地将分类结果定为0或者1,而是给出了0和1之间的概率。这就相当于对每条数据的分类结果给出了一个打分。打分越高的数据越是我们想要的。如果我们要从一个数据集中筛选出一批数据(比如100个),就只要选出打分排名前100的数据就可以了。我们也可以根据实际情况设定一个阀值,大于这个阀值的归为一类,小于这个阀值的归为另一类。
如何提高逻辑斯蒂回归的分类准确性?
个人感觉,只要特征找的准,数据量足够大,逻辑斯蒂回归将会非常好用。另外,还要注意避免过拟合。
特征选择的话,由于逻辑斯蒂回归的优点,开始的时候不用考虑各个特征之间是否有相关性,直接把能用的特征全部线性加权起来就好。经过初步训练,观察各个特征的权值,如果权值接近为0,那么就可以将这个特征看做是不相关的可以去除的特征。总结起来就是:先做加法再做减法。
解决过拟合的方法不过两种,一种是减少特征的个数;另一种是模型选择的正则化方法。正则化的话,可以参考岭回归方法。
逻辑斯蒂回归的优缺点?
优点:计算代价不高,易于理解和实现,且若采用随机梯度上升法可以在线学习;
缺点:可能容易欠拟合,分类精度不高,这个可能是因为我们无法找到足够的特征。
逻辑斯蒂回归的模型训练?
采用最大似然估计。对于二分类问题,数据属于A类的概率为H(X),那么数据属于B类的概率就为1-H(X)。模型训练就是使得训练数据的似然函数最大,于是转化为一个最优化的问题。也可以将最大似然估计理解为损失函数为对数损失函数的经验风险最小化,证明在,所以逻辑斯蒂回归的损失函数是对数损失函数。
逻辑斯蒂回归模型归结为以似然函数为目标函数的最优化问题,通常通过迭代算法求解。从最优化的观点看,这时的目标函数具有很好的性质,它是光滑的凸函数,因此多种最优化的方法都适用,保证能找到全局最优解。在解这个最优化问题的时候,通常采用近似方法如梯度上升法和拟牛顿法。为什么不像线性回归那样直接求取解析解呢?因为这将导致计算非常复杂。其中梯度上升法可能导致计算量太大,于是用随机梯度上升法代替;牛顿法或拟牛顿法一般收敛速度更快。
随机梯度上升法需要注意两个点才能达到性能完全发挥出来。首先,控制步长的alpha最好不要设定为固定值,而是随着迭代的深入而不断变小,这样有利于减少在最优值附近的震荡。这可以将alpha设置为分母随着迭代次数不断变大的分数来实现,但注意不要让alpha最后变为零,这就需要alpha设置为分数和常数的和;其次,既然是随机梯度上升,那么每次取一个样本点的时候就要随机取,不要按照顺序取,这样才能保证合理性。最后要注意迭代次数的控制。
模型参数求解出来以后是特征权重组成的向量。其实,逻辑斯蒂回归模型可以看做由两部分组成。一部分跟线性回归一样,就是一条直线;另一部分就是sigmod函数。需要注意的是,有了权重向量我们就可以线性加权了,我们的直线就是令线性加权的结果为0的公式表达。为什么要人为定为0呢?当然是为了sigmod函数啊。这样才能使正样本的线性加权大于0,在sigmod中接近1,同样负样本的线性加权小于0,在sigmod中接近0。在SVM中,同样也是先学习一个分离超平面,然后带入分类决策函数sign中。
与其它的分类算法比较?
能和逻辑斯蒂回归进行比较的就是牛逼闪闪的线性SVM了。关于这部分请移步。大概意思是:直接用线性回归做分类因为考虑到了所有样本点到分类决策面的距离,所以在两类数据分布不均匀的时候将导致误差非常大;逻辑斯蒂回归回归和SVM克服了这个缺点,前者采用将所有数据采用sigmod函数进行了非线性映射,使得远离分类决策面的数据作用减弱;后者则直接去掉了远离分类决策面的数据,只考虑支持向量的影响。
逻辑斯蒂分布
设X是连续随机变量,X服从逻辑斯蒂分布是指X具有下列分布函数和密度函数:
逻辑斯蒂分布的密度函数f(x)和F(x)的图形如下图所示:
其中,分布函数在x处的取值其实就是将密度函数在x以及之前负无穷的所有取值进行积分。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:36514次
排名:千里之外
原创:45篇
评论:24条
(4)(4)(7)(10)(7)(1)(2)(1)(3)(5)(1)(1)(4)

我要回帖

更多关于 编写sigmod函数 的文章

 

随机推荐