Logistic Regression模型推导整理

Logistic Regression模型的假设函数定义如下:
$$
\begin{align}
h_{\theta}(x) & = \frac{1}{1+e^{-\theta^T x}} \\
& = \frac{e^{\theta^T x}}{1+e^{\theta^T x}} \\
\end{align}
$$
其中,\(\theta\)为参数,\(x\)为样本的特征,\(\theta\)和\(x\)均为列向量,假设函数可以认为是将该样本标记为正例的概率,即:
$$
\begin{align}
P(Y=1 \mid x) & = h_{\theta}(x) = \frac{e^{\theta^T x}}{1+e^{\theta^T x}} \\
P(Y=0 \mid x) & = 1 – h_{\theta}(x) = \frac{1}{1+e^{\theta^T x}}
\end{align}
$$
对于给定训练集(m个样本),应用Logistic Regression模型学习时,我们可以用极大似然估计模型参数\(\theta\)。似然函数为
$$
\prod_{i=1}^{m}P(Y=1 \mid x^{(i)})^{y^{(i)}} P(Y=0 \mid x^{(i)})^{1-y^{(i)}}
$$

$$
\prod_{i=1}^{m}h_{\theta}(x^{(i)})^{y^{(i)}}(1-h_{\theta}(x^{(i)}))^{1-y^{(i)}}
$$
其对数似然函数为
$$
\begin{align}
L(\theta) & = \sum_{i=1}^{m}[y^{(i)}\log h_{\theta}(x^{(i)}) + (1-y^{(i)})\log(1-h_{\theta}(x^{(i)}))] \\
& = \sum_{i=1}^{m}[y^{(i)}(\theta^T x^{(i)}) – \log (1+e^{\theta^T x^{(i)}})] \\
\end{align}
$$
Cost Function可定义为
$$
\begin{align}
J(\theta) & =\ – L(\theta) \\
& =\ – \sum_{i=1}^{m}[y^{(i)}(\theta^T x^{(i)}) – \log (1+e^{\theta^T x^{(i)}})] \\
\end{align}
$$
那么我们现在的目标是求极大似然,也就是最小化\(J(\theta)\),可以利用梯度下降。计算梯度的方法是对\(\theta_j\)求偏导
$$
\begin{align}
\frac{\partial}{\partial \theta_j}J(\theta) & =\ – \sum_{i=1}^{m}[y^{(i)}x_{j}^{(i)} – \frac{x_{j}^{(i)}e^{\theta^T x^{(i)}}}{1+e^{\theta^T x^{(i)}}}] \\
& = \sum_{i=1}^{m} x_{j}^{(i)}(\frac{e^{\theta^T x^{(i)}}}{1+e^{\theta^T x^{(i)}}} – y^{(i)}) \\
& = \sum_{i=1}^{m} x_{j}^{(i)}(h_{\theta}(x^{(i)}) – y^{(i)}) \\
\end{align}
$$

$$
\nabla_{\theta}J(\theta) = \sum_{i=1}^{m}x^{(i)}(h_{\theta}(x^{(i)}) – y^{(i)})
$$

参考资料:
[1].统计学习方法/李航著. ——北京:清华大学出版社,2012.
[2].http://ufldl.stanford.edu/tutorial/supervised/LogisticRegression/
[3].https://www.coursera.org/learn/machine-learning

Linux下caffe框架的搭建

最近在研究深度学习,这是一种能模拟人脑进行分析学习的神经网络,其中卷积神经网络是近年飞速发展的一项技术,在图像处理等方面有广泛应用。

caffe是Berkeley Vision and Learning Center(BVLC)推出的一款基于卷积神经网络的框架。caffe使用C++开发,执行效率高,同时支持CPU和GPU运算,使用非常方便。下面来介绍下在Linux操作系统下caffe环境的搭建。

系统:Kali Linux 2.0(基于Debian 8.0)

其实在官网(http://caffe.berkeleyvision.org/install_apt.html)上说的已经非常详细了,不过有些地方还是需要修改下。

首先安装依赖:

sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler

boost库因为网络原因我无法通过apt来安装,只能去下载源码编译安装,我用的版本是1.59的,可以去官网(http://www.boost.org/)查看下载最新的版本。
下载连接:http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.bz2/download
下载完过后首先解压解包:
bunzip2 boost_1_59_0.tar.bz2
tar xvf boost_1_59_0.tar

然后通过以下命令安装:
cd boost
./bootstrap.sh
sudo ./b2
sudo ./bjam install

继续安装其他依赖:
sudo apt-get install libatlas-base-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev
sudo apt-get install cmake

依赖基本就安装完毕了,接下来我们要下载源码,源码可以在https://github.com/BVLC/caffe上面看到。
下载源码:git clone https://github.com/BVLC/caffe.git
然后可以按照官网上的教程(http://caffe.berkeleyvision.org/installation.html)进行编译。
进入caffe根目录,我们要设置下Makefile的配置信息:
cp Makefile.config.example Makefile.config
然后根据自己机器的情况对配置进行修改,因为我的机器没有GPU,要使用CPU_ONLY,所以要把Makefile.config中的 CPU_ONLY := 1 这一行取消注释。我的Makefile.config文件内容为:

接下来要对部分代码进行修改,以下文件里面的hdf5的头文件路径都需要修改:
include/caffe/util/hdf5.hpp
src/caffe/net.cpp
src/caffe/layers/hdf5_output_layer.cpp
include/caffe/layers/hdf5_output_layer.hpp
src/caffe/layers/hdf5_data_layer.cpp
include/caffe/layers/hdf5_data_layer.hpp
把对应的头文件分别改成以下两个:

可能有其他的文件也需要修改,可以根据make all的输出信息对相应的代码进行修改。

接下来就可以进行编译安装了:
mkdir build
cmake ..
make all
make runtest

至此,caffe框架我们就搭建完成了,接下来我们可以进行一下测试。caffe里面自带了一些example,我们选择使用mnist的数据进行训练测试。mnist是一套美国小学生的手写数字的数据集,我们可以在官网查看到关于该数据集的一些信息:http://yann.lecun.com/exdb/mnist/

caffe的官方文档中有告诉我们如何使用mnist训练集:http://caffe.berkeleyvision.org/gathered/examples/mnist.html

首先我们要准备数据集,进入caffe根目录,输入以下命令:
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh

然后根据机器修改相关配置文件:examples/mnist/lenet_solver.prototxt,使用CPU进行训练,我的solver定义如下:

最后在caffe根目录下输入以下命令即可训练mnist:
./examples/mnist/train_lenet.sh

在我的i7-3667U下,花了24分钟完成训练,效率还是非常高的。