1.Tensor 、Flow 、Session 、Graphs
TensorFlow 从单词上可以分成 Tensor 和 Flow 两个单词 。Tensor 即张量 ,表明了其数据结构 ;Flow 翻译可理解为流 ,直观的表达了张量之间通过计算相互转化的过程 ;还有一个很重要的概念 Session ,即对话的概念 ,用于执行定义好的运算 。简单的理解 ,Flow 体现了 TF 框架的计算模型 ;Tensor 体现了 TF 框架的数据模型 ;二者可组织数据和定义相应的运算 ,并用图(graphs)表示计算任务 。图(graphs)中的节点称之为op(operation),一个op获得0个或多个Tensor 。而对话则是用于执行定义好的运算 ,即运算都是在 session 中执行的 。
上述介绍结构见下图 ,搭配起来就比较好理解了 。
值得一提的是运算的执行在会话中进行 ,如何进行有两种方式 ,一个是明确调用会话生成和关闭 。另一个是利用 with 上下文管理器 。这里建议利用 python 上下文管理器的机制 ,将所有的计算放在“with”内部即可 ,这样一来 ,当上下文管理器退出时候会自动释放所有资源 ,这样既解决了因为异常退出时资源释放的问题 ,还解决了忘记调用 session.close 函数产生的资源泄露 。上述介绍举例如下 :
2.loss function
首先得了解什么是代价函数 ,也可以是说是损失函数 。指的是一个可以衡量预测值和真实值差异的函数 ,具体形式可以有多种选择 。我们可以用 C(ω) 表示代价函数 ,根据其意义 ,不难理解代价函数有如下性质 :
- 对于每种算法来说 ,代价函数不是唯一的 ;
- 代价函数是参数 ω 的函数 ;
- 总的代价函数可以用来评价模型的好坏 ,代价函数越小说明模型和参数越符合训练样本 (x, y) ;
- 代价函数是一个标量 ;
常用的代价函数有如下几种 :
- 二次代价函数(quadratic cost)
交叉熵代价函数(cross-entropy)
- 对数释然代价函数(log-likelihood cost)
总的来说 ,我们在训练过程中 ,目标就是通过训练使得代价函数尽可能降低 ,从而使得预期输出和实际输出接近 。
3.欠拟合和过拟合
在我们机器学习或者训练深度神经网络的时候经常会出现欠拟合和过拟合这两个名词 。首先欠拟合是指模型没能较好的捕捉到数据特征 ,不能够较理想的拟合数据 ;相对的 ,过拟合就是模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了 ,导致在后期测试的时候不能够很好地识别数据 ,即不能正确的分类 ,模型泛化能力太差 。如下图所示(来源于吴恩达老师课程)
模型训练之初 ,往往是欠拟合的 ,所以我们才有进步空间 ,不断调整算法使得模型能够较好的拟合数据 。欠拟合的解决方法大体有下面几种思路 。
- 添加其他特征项 ,有时候我们模型出现欠拟合的时候是因为特征项不够导致的 ,可以添加其他特征项来很好地解决 。
- 添加多项式特征 ,这个在机器学习算法里面用的很普遍 ,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强 。例如上面的图片的例子 。
- 减少正则化参数 ,正则化的目的是用来防止过拟合的 ,但是现在模型出现了欠拟合 ,则需要减少正则化参数 。
至于过拟合 ,可以想象一个很复杂的网络 ,包含参数相当的多 ,但是我们用于训练的数据却相对有限 。反复的训练之下 ,模型学习太过彻底 。如上图过拟合图中在训练集上十分精确 ,但是在测试集中却得不到较理想的结果 ,即模型的泛化能力很差 。常见的解决办法如下 :
- 重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
- 增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
- 采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。
- 采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。
本篇较为干燥 ,小詹自己写的都看不下去了 。但是上边提到的一些概念是本系列文章中会用得到的 ,比如过拟合的一些处理在 mnist 识别分类中就可以用上 。所以为了方便查看理解 ,还是枯燥一点写(读)下去吧 ,如果有纰漏 ,敬请批评指正 。
最后 ,如果觉得这个系列不错 ,记得扫码关注噢 !(大佬不在,小可爱代发,请多多指教!