这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战算法
常见的损失函数:0-1损失函数,绝对值损失函数,log对数损失函数,平方损失函数,指数损失函数,hinge损失函数,交叉熵损失函数等。编程
0-1损失函数数组
绝对值损失函数markdown
log对数损失函数网络
平方损失函数dom
指数损失函数函数
hinge损失函数oop
交叉熵损失函数post
常见的激活函数有:Sigmoid、Tanh、ReLU、Leaky ReLU学习
Sigmoid函数:
特色:
它可以把输入的连续实值变换为0和1之间的输出,特别的,若是是很是大的负数,那么输出就是0;若是是很是大的正数,输出就是1。
缺点:
缺点1:在深度神经网络中梯度反向传递时致使梯度消失,其中梯度爆炸发生的几率很是小,而梯度消失发生的几率比较大。
缺点2:Sigmoid 的 output不是0均值(即zero-centered)。
缺点3:其解析式中含有幂运算,计算机求解时相对来说比较耗时。对于规模比较大的深度网络,这会较大地增长训练时间。
Tanh函数:
特色:它解决了Sigmoid函数的不是zero-centered输出问题,收敛速度比sigmoid要快,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
ReLU函数:
特色:
1.ReLu函数是利用阈值来进行因变量的输出,所以其计算复杂度会比剩下两个函数低(后两个函数都是进行指数运算)
2.ReLu函数的非饱和性能够有效地解决梯度消失的问题,提供相对宽的激活边界。
3.ReLU的单侧抑制提供了网络的稀疏表达能力。
ReLU的局限性:在于其训练过程当中会致使神经元死亡的问题。
这是因为函数f(x)=max(0,x)致使负梯度在通过该ReLU单元时被置为0,且在以后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际训练中,若是学习率(Learning Rate)设置较大,会致使超过必定比例的神经元不可逆死亡,进而参数梯度没法更新,整个训练过程失败。
Leaky ReLu函数:
LReLU与ReLU的区别在于, 当z<0时其值不为0,而是一个斜率为a的线性函数,通常a为一个很小的正常数, 这样既实现了单侧抑制,又保留了部分负梯度信息以至不彻底丢失。但另外一方面,a值的选择增长了问题难度,须要较强的人工先验或屡次重复训练以肯定合适的参数值。
基于此,参数化的PReLU(Parametric ReLU)应运而生。它与LReLU的主要区别是将负轴部分斜率a做为网络中一个可学习的参数,进行反向传播训练,与其余含参数网络层联合优化。而另外一个LReLU的变种增长了“随机化”机制,具体地,在训练过程当中,斜率a做为一个知足某种分布的随机采样;测试时再固定下来。Random ReLU(RReLU)在必定程度上能起到正则化的做用。
ELU函数:
ELU函数是针对ReLU函数的一个改进型,相比于ReLU函数,在输入为负数的状况下,是有必定的输出的,并且这部分输出还具备必定的抗干扰能力。这样能够消除ReLU死掉的问题,不过仍是有梯度饱和和指数运算的问题。
LR的基本表达形式以下:
使用交叉熵做为损失函数的梯度降低更新求导的结果以下:
首先获得损失函数以下:
若是咱们使用MSE做为损失函数的话,那损失函数以及求导的结果以下所示:
使用平方损失函数,会发现梯度更新的速度和sigmod函数自己的梯度是很相关的。sigmod函数在它在定义域内的梯度都不大于0.25。这样训练会很是的慢。使用交叉熵的话就不会出现这样的状况,它的导数就是一个差值,偏差大的话更新的就快,偏差小的话就更新的慢点,这正是咱们想要的。
在使用 Sigmoid 函数做为正样本的几率时,同时将平方损失做为损失函数,这时所构造出来的损失函数是非凸的,不容易求解,容易获得其局部最优解。若是使用极大似然,其目标函数就是对数似然函数,该损失函数是关于未知参数的高阶连续可导的凸函数,便于求其全局最优解。(关因而否是凸函数,由凸函数的定义得,对于一元函数,其二阶导数老是非负,对于多元函数,其Hessian矩阵(Hessian矩阵是由多元函数的二阶导数组成的方阵)的正定性来判断。若是Hessian矩阵是半正定矩阵)
要计算F1score,首先要计算 Precision 和 Recall,公式以下:
FM和SVM最大的不一样,在于特征组合时权重的计算方法
FM模型有两个优点:
在高度稀疏的状况下特征之间的交叉仍然可以估计,并且能够泛化到未被观察的交叉参数的学习和模型的预测的时间复杂度是线性的
随机森林的随机性体如今每颗树的训练样本是随机的,树中每一个节点的分裂属性集合也是随机选择肯定的。有了这2个随机的保证,随机森林就不会产生过拟合的现象了。
思路:贪心算法
依次遍历数组中的每个位置,并实时维护最远能够到达的位置 rightMost,注意当前遍历到的位置 i 要在最远能够到达的位置范围内(也就是知足 i <= rightMost),当rightMost 大于或等于 数组最后一个位置时,就表示能够到达,返回 True,不然就要返回 False。
代码以下:
class Solution:
def canJump(self, nums: List[int]) -> bool:
n = len(nums)
rightMost = 0
for i in range(n):
if i <= rightMost:
rightMost = max(rightMost, i + nums[i])
if rightMost >= n-1:
return True
return False
复制代码
时间复杂度:O(n),其中 n 为数组的大小。只须要访问 nums 数组一遍,共 n 个位置。
空间复杂度:O(1),不须要额外的空间开销。