很久之前就玩过 TensorFlow Playground,但当时对神经网络只有一个简单的概念,不明白各种参数的意义,把它们胡乱点了一遍,并且尝试多次也没能把螺旋形状的数据集分类成功。
现在Andrew Ng 的课程学习过半( 对之前 Ng 课程笔记有兴趣的同学可以访问 线性回归、逻辑回归 与 神经网络 ),在理解的基础上再玩了下,的确有不同的体会。而且由于 TensorFlow Playground 是开源的( 代码简洁工整 ),所以可以把源码取回来然后按照自己的方式来玩~
So~,我的玩法就是修改 TensorFlow Playground 来回顾 Ng 之前课程的内容,以下是玩法参考。有啥有意思的玩法也请留言告诉我哈 (●—●) ~
线性回归
- 将所有的 特征 直接连接到 OUTPUT
- 当问题类型选择为 Regression( 回归问题 )的时候,OUTPUT 的激活函数默认用的 Linear( 就是 Identity,见激活函数部分 ),所以整个网络的输出和 线性回归 的 预测函数 相同
- 神经网络使用的学习算法是 反向传播,根据 链式法则 你会发觉,我们这样连接网络后,权值的更新方式和 线性回归 是相同的
- 可以添加高次的 多项式特征 来增强网络的学习能力( 记得在代码的序列化部分也加上,这样你的选择状态就会被记录下来,省得每次要重新把特征一个个选上 )
- Standardization,把特征标准化( 注意一定要做 Standardization,否则你的 损失函数 瞬间就飞走了,根本走不到谷底 )
逻辑回归
- 将所有的 特征 直接连接到 OUTPUT
- 问题类型为 Classification( 分类问题 )时,OUTPUT 默认的激活函数是 Tanh,所以我们要把它改为 Sigmoid,使得整个网络的输出和 逻辑回归 的 预测函数 相同
- 将 测试集 原先的结果 1、-1 改为 1、0
- 添加新的 损失函数,使得经过 链式法则,权值的更新方式和 逻辑回归 是相同的
- 添加高次 多项式特征
- Standardization,把特征标准化
- 将 决策边界 的判断值 0 改为 0.5( 因为网络的输出已经变成了 0 到 1 )
神经网络
- 根据 Wiki 的 Activation Function 词条 来尝试不同的激活函数
- 修改网络的层数限制
- 修改每层网络神经元个数限制
Tips
- 连接神经元的权值是可以手动修改的
- 隐含层的每个神经元左下角可以手动观察调整 Bais
- 把鼠标停留在神经元上,可以在右侧观察它的输出
- 单步可以帮助你来调试你修改的代码是否正确( 输出一些中间计算值 )
- 从 学习曲线 可以帮助你判断你的模型遇到 高偏差 还是 高方差 问题
- 希望权值不要过大而产生 过拟合 的话,可以使用 L1 或 L2 正则化