ML | Loss function & Activation function
Loss function损失函数用来评价模型的预测值和真实值不一样的程度，损失函数越好，通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数分为经验风险损失函数和结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别，结构风险损失函数是指经验风险损失函数加上正则项。常见损失函数与优缺点Zero-one loss$$ L(Y,f(X))= \left\{\begin{matrix} 1,Y\neq f(X) \\ 0,Y=f(X)\end{matrix}\right. $$0-1损失函数直接对应了分类判断错误的个数，但它是非凸函数，不好优化感知机使用的即是该损失函数，但这个条件太严格，也可以放宽条件：$$ L(Y,f(X))= \left\{\begin{matrix} 1,\left| Y-f(X)\right|\geq T \\ 0,\left| Y-f(X)\right|<T \end{matrix}\right. $$绝对值损失函数$$ L(Y,f(x))=\left|Y-f(x)\right| $$log对数损失函数$$ L(Y,P(Y|X))=-logP(Y|X) $$log对数损失函数能非常好的表征概率分布，在很多场景尤其是多分类，如果需要知道结果属于每个类别的置信度，那它非常适合健壮性不强，相比于hinge loss对噪声更敏感逻辑回归的损失函数就是log对数损失函数平方损失函数$$ L(Y|f(X))=\sum_N(Y-f(X))^2 $$经常应用于回归问题Exponential loss$$ L(Y|f(X))=exp[-yf(x)] $$对离群点、噪声非常敏感，常用在AdaBoost算法（迭代算法，针对同一个训练集训练不同的分类器）中Hinge$$ L(y,f(x))=max(0,1-yf(x)) $$该式子表示，如果分类正确，那么损失为0，否则为\(1-yf(x)\)，SVM支持向量机即选用该损失函数一般\(f(x)\)是预测值，在\((-1,1)\)之间，\(y\)则是目标值，其不鼓励分类器过度自信，即\(-1<f(x)<1\)，让某个正确分类的样本距离分割线超过1不会有任何奖励，从而使分类器更加专注于整体误差健壮性较高，对异常点、噪声不敏感，无较好的概率解释Perceptron loss 感知损失$$ L(y,f(x))=max(0,-f(x)) $$是Hinge损失的变种，Hinge对判定边界附近的点惩罚力度很高，而perceptron loss只要样本的判定类别正确，它就满意，不管其判定边界的距离，其泛化能力没Hinge强Cross-entropy loss function$$ L=-\frac{1}{n}\sum_x[y\text{ln}a+(1-y)\text{ln}(1-a)] $$其中，\(x\)表示样本，\(y\)表示实际的标签，\(a\)表示预测的输出，\(n\)表示样本总数本质是一种对数似然函数，可用于二分类和多分类中（输入数据是softmax或sigmoid函数的输出）二分类中 $$ loss=-\frac{1}{n}\sum_x[y\text{ln}a+(1-y)\text{ln}(1-a)] $$多分类中 $$ loss=-\frac 1 n \sum_i y_i\text{ln}a_i $$当使用sigmoid作为激活函数时，常用交叉熵损失函数而非均方误差损失函数，因其可完美解决均方损失函数权重更新过慢的问题，具有“误差大更新快，误差小更新慢”的良好性质均方误差损失函数（MSE）$$ MSE(y,y')=\frac{\sum_{i=1}^n (y_i-y_i')^2}{n} $$Activation function激活函数（Activation Function）是一种添加到人工神经网络中的函数，旨在帮助网络学习数据中的复杂模式。类似于人类大脑中基于神经元的模型，激活函数最终决定了要发射给下一个神经元的内容。Sigmoid$$ f(x)=\frac1 {1+e^{-z}} $$输出范围在0到1之间，由此可知其对每个神经元的输出进行了归一化用在把预测概率作为输出的模型中梯度平滑，避免跳跃输出函数可微，且是明确的预测Drawbacks: 倾向于梯度消失、输出函数不以0为中心，会降低权重更新效率、执行指数运算，计算机运行速度慢Softmax$$ f(x)=\frac{e^{x_i}}{\sum_{j=1}^{K}e^{x_j}} $$Softmax 是用于多类分类问题的激活函数，在多类分类问题中，超过两个类标签则需要类成员关系。对于长度为 K 的任意实向量，Softmax 可以将其压缩为长度为 K，值在（0，1）范围内，并且向量中元素的总和为 1 的实向量。Softmax 与正常的 max 函数不同：max 函数仅输出最大值，但 Softmax 确保较小的值具有较小的概率，并且不会直接丢弃。我们可以认为它是 argmax函数的概率版本或「soft」版本。Softmax 函数的分母结合了原始输出值的所有因子，这意味着 Softmax 函数获得的各种概率彼此相关。Softmax激活函数的主要缺点是：在零点不可微；负输入的梯度为零，这意味着对于该区域的激活，权重不会在反向传播期间更新，因此会产生永不激活的死亡神经元。Tanh 双曲正切$$ f(x)=tanh(x)=\frac 2 {1+e^{-2x}}-1 $$与Sigmoid函数相似，但具有一定的优势当输入较大或较小时，输出几乎是平滑的且梯度较小，不利于权重更新tanh输出间隔为1，且整个函数以0为中心负输入也将被映射为负，而零输入被映射为0在一般二元分类问题中，tanh函数常用于隐藏层，而sigmoid函数常用于输出层，但也需要根据实际情况来进行调整ReLU激活函数$$ \sigma(x)= \left\{\begin{matrix} max(0,x),x\geq0 \\ 0,x<0\end{matrix}\right. $$输入为正时，不存在梯度饱和的问题计算速度很快，只存在线性关系但当输入为负时，其完全失效，在反向传播过程中如果输入负数则梯度将完全变0，这与sigmoid和tanh函数相似输出为0或正数，也不是以0为中心的函数Leaky ReLU$$ \sigma(x)= \left\{\begin{matrix} y_i,y_i>0 \\ a_iy_i,y_i\leq0\end{matrix}\right. $$Leaky ReLU通过把x的非常小的线性分量给予负输入来调整负值的零梯度问题leak有助于扩大ReLU函数的问题，通常a取0.01左右，使得其函数范围为负无穷到正无穷ELU$$ g(x)=ELU(x)=\left\{\begin{matrix} x,x>0 \\ \alpha(e^x-1),x\leq0\end{matrix}\right. $$ELU 的提出也解决了 ReLU 的问题。与 ReLU 相比，ELU 有负值，这会使激活的平均值接近零。均值激活接近于零可以使学习更快，因为它们使梯度更接近自然梯度。显然，ELU 具有 ReLU 的所有优点，并且：没有 Dead ReLU 问题，输出的平均值接近 0，以 0 为中心；ELU 通过减少偏置偏移的影响，使正常梯度更接近于单位自然梯度，从而使均值向零加速学习；ELU 在较小的输入下会饱和至负值，从而减少前向传播的变异和信息。
Transforms的结构及用法transforms.py相当于一个工具箱，工具箱中有名为totensor，resize等工具，图片被这些工具处理之后会得到我们想要的结果。在使用工具前，需要创建具体的工具，如：tool = treansforms.ToTensor()，接着将图片输入，得到结果：tensor_img = tool(img). 主要操作流程为：输入图片，使用PIL库中的Image.open()常见的Transforms要弄清楚输入输出的数据类型，处理的方法能实现什么样的效果。