洞明先生的博客

穷通悟理是极乐
  新随笔  :: 管理

高效计算_七月算法5月深度学习班第2次课程笔记

Posted on 2016-06-01 17:11  洞明  阅读(725)  评论(0编辑  收藏  举报
 
  desc
矩阵计算
要开始逐步 去尝试接收矩阵计算
在逻辑等价上,矩阵计算 与 for循环 是等价的
for 循环是矩阵运算的标量化,是低效的
高效计算的基础是大量使用矩阵运算
规范你的编程
1. 用库来规范自己的科学计算行为,你用的矩阵操作,在 numpy scipy 上都有
2. 用库来规范你的预处理,preprocess
3. 用库来规范你的文本预处理 nltk
这体现你的工程能力,规范能力
而不是 没有图谱路线的,乱操作,没有章法,重复coding
 
这也可以理解为 data process 中的 框架,就像 UI 中的框架
列表推导式
list comprehension
dict comprehension
即:[x for x in a if x%2==0]
即:[x:x**2 for x in a if x%2==0]
 
评价:python处理字符简直就是神器
model 中 损失函数的地位
不同的model 本质 就是不同的损失函数 【观点】
以为 数据预处理完毕以后,直接用的是 损失函数,而不是model的过程,那个是 推导出来的,即上的只有 损失函数,损失函数 stand for the model
图像相似度匹配的传统方法
图像分类下有一个KNN算法(较简单的),可以用来分类,对其改进的有ANN(近似最近邻)
因为KNN 需要存储 N个样本的feature vector,而且计算量 也是 (全连接图)
ANN 使得 KNN 工业可用,即:计算速度、内存等降低了
ANN 可以海量了,是 KNN的 拓展,可以视为 工业化的 KNN
 
基于KNN 的图像相似度匹配:(K=1)
其基本思路就是 直接计算两个 矩阵的差,使用的是 曼哈顿距离,即 直接element-wise 的差的绝对值相加 作为 cost,而这种方法不涉及 梯度下降,直接在 像素上面操作,计算量很大,是最 naive 的不用 神经网络的图像匹配了
# 谢文奇的那个 100个国家的国旗的方法,就可以用这个,唯一的门槛 就是把 image 导出成数组
opencv+numpy直接把图片导出成数组了
 
基于KNN 的图像分类:
每一次都是用测试集的一张图片去比对训练集中每一张图片,以曼哈顿距离为例:
将输入图片和训练图片之间像素值做差,得到整张图上图片之间的像素差值的总和。
这样对差值进行排序,找到N个最小值,看看这N个最小值中那个类所占的数量最多。
就判断输入的图像时那一类。
 
基本思路都是:像素置信率
这个依据图像像素的识别的角度就是:将像素进行统计得到一个置信率。根据置信率判断物体属于哪种
 
后来,图像识别领域有了人工特征:SIFT、HOG,gist 等特征,
将特征扔到SVM等分类器中
 
如果是操作像素的话,图片拉成为一维向量再操作的
如果图像的size 不一样,要做 rescale,这也是预处理的过程,使其大小一样
图像处理的一些观点
what computer see is not human see
电脑看到的是数字,而且很离散 256位,而人看到但是颜色
其实能用数字代表颜色,这个逻辑是对的,但是太离散的,毕竟人识别不了那么多的的颜色
也就是说:人因为有color,忽略了微小的差异,从而提高的物体的识别率
所以 做图像需要做 白化, 这个需要仿照学习下人的特点
 
寒老师做过的
做过:
·1min 内 百万级图像 的前1000张 相似度篇
·推荐
·RNN generate 郭敬明的文本 和 linux Kernel code
·应该做过 CTR
图像识别领域的困难
1. 视角不同,不同的角度看到的像素是不同的,增大了难度
   而你的 识别就是基于 像素的
 
2. 尺寸的不同、光影的不同,像素分布也不同
  所以在选择特征时要选择对光照不敏感的特征,提高特征的鲁棒性
KNN 中的K
是超参数,需要设定
对一份数据集和测试集划分后,还需要对训练集再次划分。
比方说5部分,我们要用KNN建模,K的选择我们需要找个办法来判定,这里用N折交叉验证来判定,比方说我们选N=5,我们可以轮番用4折做训练,第五折做交叉验证,对五个准确率取平均,
看K取多少的时候准确率最高就可以选几。
 
knn kmeans 中 k 都是参数
聚为几类,可以立解为:议会的席数
线性分类器
一定有一个得分函数
根据打分函数判断最终属于哪一类,或者排序 等等
LR linearSVM softmax(log 线性)
caffe
caffee zoo 就是 很多 pre train
 
特点是:几乎只需写配置文件,跑一跑别人的模型很容易
它建立了自己的 pre train 的 生态圈,这个是 caffe 的高明之处
但是 屏蔽了原理,对于搞研究不适合,即 定制化不强
工程或者是跑别人的结果试试什么的,这个caffe确实挺方便的。
 
 
整理
caffe 编译的资料
 
caffe 的ipython notebook
梯度分类
数值梯度,解析梯度
寒老师的经验:解析梯度,最好自己在小数据集上,验证一下,因为 不一定求导对了
Wx的另类观点
W 的每一行都可以视为一个 模板
因为 最后要分为积累,W 就有几行,所以W 的行数就是 类别数
而每一行相当于 本类的 模板,与它相乘后 就是这个模板类别下的分值
然后 argmax
寒老师 还做的就是:将各个 模板 也给 可视化了一下
 
note
1. 图像拉成列向量
2. 权重矩阵W 的每行对应每一类的模板
3. 截距项b维度和最后分类个数一致
合页损失函数
本质是一个分段函数,所以才叫做 hinge,合页,即:
对于每一个样本的预测:
即:如果   f(xi, W)j +delta 的值,它敢比 f(xi, W)yi 的值大,那么就要惩罚它,即 计入loss 当中
这是 损失的含义,如果大不过f(xi,W)yi,那么cost 就是0
 
而 SVM 当中的 合页损失函数
此时的 delta 是1,即:其实还是用的是感知机的损失函数,如果分类对了 y(wx+b) 为正,否则为负
那么 如果分类分错了,那么: -y(wx+b) 为正,那么应该计入为惩罚
 
而delta 就是这里 想要超第二名多远,就是 如果是 -0.5,也不行,也就是态度不明确,一起惩罚
只有态度明确,界线足够远才 不惩罚
 
而感知机的损失函数是:
即:分类正确奖励,分类错误惩罚
 
 
summary,感觉
合页损失函数就是:分类错误惩罚,分类正确不奖励不惩罚,而且离界限区要足够远
是一个严厉的Judge
softmax 的损失函数
第一种解释就是 MLE:
,即只管 正确分类的概率,让它最大化
 
第二种解释 就是交叉熵的思想:对于每一个样本
(1)第一种理解最直接就是 -log 损失函数,里面应该是 MLE值
(2)第二种就是交叉熵,即 Σplog(p/q)
        因为 只属于一类,tag 是 a =[1, 0, 0, 0] ,pred 是 b = [0.1, 0.5, 0.2, 0.2]
    Σai*log(ai/bi)
 =1*log*(1/bi)
 = - log(bi)
 
工业上的tech,即尽量不要做除法,取log 了就可以避免除法操作,即:
将损失函数改成这个样子:
工业上还有一个tech,防止log 内为0