2018-11-22 MNIST【1】softmax regression

1、前言:

mnist在Kaggle的方准确率演化过程  

图和数据来自kaggle网站。

mnist数据集出现在视野里面时候是3年前,而这个比赛在2012年7月25号就上线了,本文的主要工作就是追随大神们这几年的脚步,复原对于本问题的详细解法以及研究思路演化路径。本文主要以文字为主,展示思路,具体内容可看连接。(忍不住又要开始敲一敲公式了。。)

mnist数据集合的几种方法:

92%:softmax回归。

97%:非线性模型:包括kNN,随机森林等

98-99%:SVM+非线性核or全连接的神经网络,再在二者基础上选择合理的参数。

99.5%:CNN LeNet5

99.5%以上需要更多的数据集合。所以我来代码复现下上面几种方法。综合对比下实际效果。在做之前,先明确下以下条件!

Warning!!The original dataset has 70000 images split in 60k train and 10k test. Kaggle splits the same dataset into 42k train and 28k test. Thus Kaggle's unknown test images are contained with known labels in the original dataset's training subset. Therefore, you can not train your models with the original MNIST dataset.详见数据集下载地址

2、方法测试

2.1 softmax回归

基础概念:指数分布族

2.1.1合适的预测函数

我们的问题是10分类问题,所以我们的目标值y^{(i)}取值范围为:y^{(i)} \in \{1,\ldots,K\}(不是0-9,这样的做法是比较好标记类比数并可清晰阐述相关问题),同时我们的输入x是784(28×28)维的向量,目标是求出合适\theta,以便找到我们的高纬度的线性边界\theta^{\top} x

基于我们的softmax函数(又称归一化指数函数):\sigma(x) _j=\frac{\exp(\theta^{(j)\top} x)}{ \sum_{j=1}^{K}{\exp(\theta^{(j)\top} x) }},得到我们的预测函数h_\theta(x)

\begin{align}h_\theta(x) =\begin{bmatrix}P(y = 1 | x; \theta) \\P(y = 2 | x; \theta) \\\vdots \\P(y = K | x; \theta)\end{bmatrix}=\frac{1}{ \sum_{j=1}^{K}{\exp(\theta^{(j)\top} x) }}\begin{bmatrix}\exp(\theta^{(1)\top} x ) \\\exp(\theta^{(2)\top} x ) \\\vdots \\\exp(\theta^{(K)\top} x ) \\\end{bmatrix}\end{align}

强调,数据较多情况下,\sum_{j=1}^{K}{\exp(\theta^{(j)\top} x)}很可能在出现\inf的情况。所以要十分注意!!

softmax python实现代码

强调:softmax只是把我们输入的向量,映射到0-1空间,而且会突出数值比较的大的项,具体可以见下图。

图片来自台大李宏毅《一天搞懂深度学习》

上图中虽然看似没啥问题:实则溢出问题蕴含其中!假如z_1,z_2,z_3=1000,1000,10000这样就会出现\inf情况的产生!我程序编程实现中发现y经过一轮迭代后,最大值可达到3,000,000额,着实有点大。那么怎么解决这个问题,其实用到了softmax函数的性质:softmax(x) =softmax(x-a) ,证明过程如下:

\begin{align}\sigma(x+a) _j&=\frac{\exp(\theta^{(j)\top} x+a)}{ \sum_{j=1}^{K}{\exp(\theta^{(j)\top} x+a) }} \\& = \frac{\exp(\theta^{(j)\top} x)\exp(a)}{\exp(a) \sum_{j=1}^{K}{\exp(\theta^{(j)\top} x) }} \\&=\sigma(x)_j\end{align}

2.1.2 Cost Function

借鉴Logistic regression的方法,我们得到二分类的Cost Function:

J(\theta) = -\left[ \sum_{i=1}^m y^{(i)} \log h_\theta(x^{(i)}) + (1-y^{(i)}) \log (1-h_\theta(x^{(i)})) \right]

我们对J(\theta)做个更形象化的改化:

J(\theta) = - \left[ \sum_{i=1}^{m} \sum_{k=0}^{1} 1\left\{y^{(i)} = k\right\} \log P(y^{(i)} = k | x^{(i)} ; \theta) \right]

这里1\{\hbox{a true statement}\}=1;1\{\hbox{a false statement}\}=0

所以我们可以由此得到softmax的cost function(K的取值变一下,以及h_\theta(x)带入就可以了)。

J(\theta) = - \left[ \sum_{i=1}^{m} \sum_{k=0}^{K} 1\left\{y^{(i)} = k\right\} \log P(y^{(i)} = k | x^{(i)} ; \theta^{(k)}) \right]


J_\theta的求法

2.1.3 Gradient Descent

既然损失函数差不多样子,那么内核(sigmoid和softmax)不同的两个函数偏导会不会也差不多呢?

先列出Logistic regression的\nabla_{\theta_j}J(\theta)为:

\nabla_{\theta_j}J(\theta) = \frac{1}{m} \sum_{i=1}^m(h_\theta( x^{(i)})  -y^{(i)}) x_{j}^{(i)}

与Logistic regression的对单个\theta_j求导不同,softmax regression需要对每个\theta^{(k)}中的第j个元素求偏导\frac{\partial J(\theta)}{\partial \theta_{j}^{(k)}}

求softmax的偏导\nabla_{\theta^{(k)}} J(\theta)具体过程如下:

第一步将与j相关或者无关的项拆分,这样便于求偏导

\begin{align}\nabla_{\theta^{(k)}} J(\theta) = -\frac{1}{m}\left[  \sum_i^m \frac{\partial}{\partial\theta_j} (1\left\{y^{(i)} = j\right\} \log P(y^{(i)} = j | x^{(i)} ; \theta^{(j)})+\sum_{k\neq j}^K1\left\{y^{(i)} = k\right\} \log P(y^{(i)} = k | x^{(i)} ; \theta^{(k)}))  \right]\end{align}

针对\log项进行化简计算

\log P(y^{(i)} = j | x^{(i)} ; \theta^{(j)}) = \log\frac{\exp(\theta^{(j)\top} x)}{ \sum_{j=1}^{K}{\exp(\theta^{(j)\top} x) }}=\theta^{(j)\top} x-\log(\sum_{j=1}^{K}{\exp(\theta^{(j)\top} x) })

得到:

\begin{align}\end{align}\begin{align}\nabla_{\theta^{(k)}} J(\theta) & = -\frac{1}{m}\left[  \sum_i^m((1\left\{y^{(i)} = j\right\} ( x^{(i)}- \frac{\exp(\theta^{(j)\top} x^{(i)})x^{(i)}}{ \sum_{l=1}^{K}{\exp(\theta^{(l)\top} x^{(i)}) }} )   + \sum_{k\neq j}^K1\left\{y^{(i)} = k\right\} ( -\frac{\exp(\theta^{(j)\top} x^{(i)})x^{(i)}}{ \sum_{l=1}^{K}{\exp(\theta^{(l)\top} x^{(i)}) }} ) \right]   \\& = -\frac{1}{m}\left[  \sum_i^m(x^{(i)}( 1\left\{y^{(i)} = j\right\}- \frac{1\left\{y^{(i)} = j\right\} \exp(\theta^{(j)\top}x^{(i)})}{ \sum_{l=1}^{K}{\exp(\theta^{(l)\top} x^{(i)}) }}   - \sum_{k\neq j}^K1\left\{y^{(i)} = k\right\} \frac{\exp(\theta^{(j)\top} x^{(i)})}{ \sum_{l=1}^{K}{\exp(\theta^{(l)\top} x^{(i)}) }} ) \right] \\&= - \frac{1}{m}\sum_{i=1}^{m}{ \left[ x^{(i)} \left( 1\{ y^{(i)} = k\}  - P(y^{(i)} = k | x^{(i)}; \theta) \right) \right]  }\end{align}

超级类似的表达式有没有??都是\sum (y-h(x))x这种形式。

2.1.4 Redundant

softmax有个特性就是它的参数是冗余的。也就是说如果我们的目标参数并不唯一。证明方法就是从softmax方程中的参数向量\theta^{(k)}中拿走\psi,看是否还满足我的概率分布的要求,如果满足则证明有很多参数是满足我们的需求的。

\begin{align}P(y^{(i)} = k | x^{(i)} ; \theta)&= \frac{\exp((\theta^{(k)}-\psi)^\top x^{(i)})}{\sum_{j=1}^K \exp( (\theta^{(j)}-\psi)^\top x^{(i)})}  \\&= \frac{\exp(\theta^{(k)\top} x^{(i)}) \exp(-\psi^\top x^{(i)})}{\sum_{j=1}^K \exp(\theta^{(j)\top} x^{(i)}) \exp(-\psi^\top x^{(i)})} \\&= \frac{\exp(\theta^{(k)\top} x^{(i)})}{\sum_{j=1}^K \exp(\theta^{(j)\top} x^{(i)})}.\end{align}

在实际应用中,为了使算法实现更简单清楚,往往保留所有参数,而不任意地将某一参数设置为 0。但此时我们需要对代价函数做一个改动:加入权重衰减。权重衰减可以解决 softmax 回归的参数冗余所带来的数值问题。

2.1.5 L2 regularization

正则化方法:防止过拟合,提高泛化能力!

在训练数据不够多时,或者overtraining时,常常会导致overfitting(过拟合)。其直观的表现如下图所示,随着训练过程的进行,模型复杂度增加,在training data上的error渐渐减小,但是在验证集上的error却反而渐渐增大——因为训练出来的网络过拟合了训练集,对训练集外的数据却不work。

关于过拟合的解释:过拟合的时候,拟合函数的系数往往非常大,为什么?如下图所示,过拟合,就是拟合函数需要顾忌每一个点,最终形成的拟合函数波动很大。在某些很小的区间里,函数值的变化很剧烈。这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以只有系数足够大,才能保证导数值很大。

过拟合

由此得到新的代价函数:

J(\theta) = - \left[ \sum_{i=1}^{m} \sum_{k=0}^{K} 1\left\{y^{(i)} = k\right\} \log P(y^{(i)} = k | x^{(i)} ; \theta^{(k)}) \right]+\frac{\lambda }{2} \sum_{i=1}^{m}\sum_{k=1}^{K}\theta_{ik} ^2

\nabla_{\theta^{(k)}} J(\theta)  = - \sum_{i=1}^{m}{ \left[ x^{(i)} \left( 1\{ y^{(i)} = k\}  - P(y^{(i)} = k | x^{(i)}; \theta) \right) \right]  }+\lambda \theta_j

2.1.6 Vectorization

原理说完,公式推完,现在就需要计算机进行计算工作了,但是我们遇到的问题一般是矩阵求解问题,需要将这个梯度求解方程转换为矩阵形式表示一下。

首先对于MNIST问题来说,我们是10个类别784个维度特征。主要是向量化方便机器进行计算。

2.1.7 代码、结果以及后感

看代码:链接


cost

坑1:RuntimeWarning: invalid value encountered in true_divide

np.exp(z.T) / np.sum(np.exp(z)  分母中Z过大导致无解,或者z偏移后整体z很小导致全为0。经过测试,e^zz\in [-700,700]的范围内才有解,要不然就是0,要不就是inf。

坑2:pd.read_csv 读入的是dataframe数据结构,但是在处理数值传递时感觉还是array好用,所以尽量一进来就把这个格式改成array。

坑3:输入数据应该归一化的。额若不归一化会导致上述问题的产生。

最后又回归问题本身,一些常用情况下的梯度爆炸原因见连接

2.2 kNN

未完待续。预计11月25号前完成

2.3 随机森林

未完待续。预计11月30号前完成

2.4 SVM

未完待续预计11月25号前完成

2.5 CNN

未完待续


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354