未验证 提交 9d6df00c 编写于 作者: Y yuyang18

Tiny enhance of configure_simple_model

上级 d6157cff
......@@ -7,12 +7,12 @@
前言
####
在解决实际问题时,可以先从逻辑层面对问题进行建模,明确模型所需要的 **输入数据类型**、**计算逻辑**、**求解目标** 以及 **优化算法**。模型定义清晰后,可以使用PaddlePaddle提供的丰富算子来实现模型逻辑。下面以一个简单回归任务举例说明如何使用PaddlePaddle构建模型。该例子完整代码参见 `fit_a_line <https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/tests/book/test_fit_a_line.py>`_。
在解决实际问题时,可以先从逻辑层面对问题进行建模,明确模型所需要的 **输入数据类型**、**计算逻辑**、**求解目标** 以及 **优化算法**。模型定义清晰后,用户可以使用PaddlePaddle提供的丰富算子来实现模型逻辑。下面以一个简单回归任务举例说明如何使用PaddlePaddle构建模型。该例子完整代码参见 `fit_a_line <https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/tests/book/test_fit_a_line.py>`_。
问题描述及定义
##############
问题描述: 给定一组数据 :math:`<X, Y>`,求解出函数 :math:`f`,使得 :math:`y=f(x)`,其中 :math:`x\subset X` 表示一条样本的特征,为 :math:`13` 维的实数向量;:math:`y\subset Y` 为一实数表示该样本对应的值。可以尝试用回归模型来对问题建模,回归问题的损失函数有很多,这里选择常用的均方误差。为简化问题,这里假定 :math:`f` 为简单的线性变换函数。除了明确模型的输入格式、求解目标以及模型结构外,还需要选择合适的优化方法,这里选用随机梯度下降算法来求解模型。
问题描述: 给定一组数据 :math:`<X, Y>`,求解出函数 :math:`f`,使得 :math:`y=f(x)`,其中 :math:`x\subset X` 表示一条样本的特征,为 :math:`13` 维的实数向量;:math:`y \subset Y` 为一实数表示该样本对应的值。我们可以尝试用回归模型来对问题建模,回归问题的损失函数有很多,这里选择常用的均方误差。为简化问题,这里假定 :math:`f` 为简单的线性变换函数。除了明确模型的输入格式、求解目标以及模型结构外,还需要选择合适的优化方法,这里选用随机梯度下降算法来求解模型。
使用PaddlePadle建模
###################
......@@ -29,12 +29,13 @@ PaddlePaddle提供了data算子来描述输入数据的格式。data算子的输
x = fluid.layers.data(name='x', shape=[13], dtype='float32')
y = fluid.layers.data(name='y', shape=[1], dtype='float32')
该模型使用的数据比较简单,事实上data算子还可以描述变长的、嵌套的序列数据,更详细的文档可参照 `layers.data <http://www.paddlepaddle.org/docs/develop/api/fluid/en/layers.html#permalink-33-data>`_。
该模型使用的数据比较简单,事实上data算子还可以描述变长的、嵌套的序列数据。也可以使用:code:`open_files`
打开文件进行训练。更详细的文档可参照 :ref:`user_guide_prepare_data`。
前向计算逻辑
------------
实现一个模型最重要的部分是实现计算逻辑,PaddlePaddle提供了丰富的算子,这些算子的封装粒度不同,通常对应一种或一组变换逻辑,算子输出即为对输入数据执行变换后的结果。可以灵活使用算子来完成复杂的模型逻辑,比如图像相关任务中会使用较多的卷积算子,序列任务中会使用LSTM/GRU等算子。复杂模型通常会组合多种算子,以完成复杂的变换,PaddlePaddle提供了非常自然的方式来组合算子,一般地可以使用下面的方式:
实现一个模型最重要的部分是实现计算逻辑,PaddlePaddle提供了丰富的算子。这些算子的封装粒度不同,通常对应一种或一组变换逻辑。算子输出即为对输入数据执行变换后的结果。用户可以灵活使用算子来完成复杂的模型逻辑。比如图像相关任务中会使用较多的卷积算子、序列任务中会使用LSTM/GRU等算子。复杂模型通常会组合多种算子,以完成复杂的变换。PaddlePaddle提供了非常自然的方式来组合算子,一般地可以使用下面的方式:
.. code-block:: python
......@@ -42,7 +43,7 @@ PaddlePaddle提供了data算子来描述输入数据的格式。data算子的输
op_2_out = fluid.layers.op_2(input=op_1_out, ...)
...
其中op_1和op_2表示算子类型,可以是fc来执行线性变换,也可以是conv来执行卷积变换等。通过算子的输入输出的连接来定义算子的计算顺序以及数据流方向,上面的例子中,op_1的输出是op_2的输入,那么在执行计算时,会先计算op_1,然后计算op_2。更复杂的模型可能需要使用控制流算子,依据输入数据来动态执行,针对这种情况,PaddlePaddle提供了IfElseOp和WhileOp等,算子的文档可参考 `layers <http://www.paddlepaddle.org/docs/develop/api/fluid/en/layers.html>`_。具体到这个任务, 我们使用一个fc算子:
其中op_1和op_2表示算子类型,可以是fc来执行线性变换(全连接),也可以是conv来执行卷积变换等。通过算子的输入输出的连接来定义算子的计算顺序以及数据流方向。上面的例子中,op_1的输出是op_2的输入,那么在执行计算时,会先计算op_1,然后计算op_2。更复杂的模型可能需要使用控制流算子,依据输入数据来动态执行,针对这种情况,PaddlePaddle提供了IfElseOp和WhileOp等。算子的文档可参考 :ref:`api_fluid_layers`。具体到这个任务, 我们使用一个fc算子:
.. code-block:: python
......@@ -51,7 +52,7 @@ PaddlePaddle提供了data算子来描述输入数据的格式。data算子的输
损失函数
--------
损失函数对应求解目标,可以通过最小化损失来求解模型。大多数模型使用的损失函数,输出是一个实数值,但是PaddlePaddle提供的损失算子一般是针对一条样本计算,当输入一个batch的数据时,损失算子的输出有多个值,每个值对应一条样本的损失,所以通常会在损失算子后面使用mean等算子,来对损失做归约。模型在一次前向迭代后会得到一个损失值,PaddlePaddle依据该值计算梯度,然后自动执行链式求导法则计算模型里面每个参数对应的梯度值。这里使用均方误差损失:
损失函数对应求解目标,我们可以通过最小化损失来求解模型。大多数模型使用的损失函数,输出是一个实数值。但是PaddlePaddle提供的损失算子一般是针对一条样本计算。当输入一个batch的数据时,损失算子的输出有多个值,每个值对应一条样本的损失,所以通常会在损失算子后面使用mean等算子,来对损失做归约。模型在一次前向迭代后会得到一个损失值,PaddlePaddle会自动执行链式求导法则计算模型里面每个参数和变量对应的梯度值。这里使用均方误差损失:
.. code-block:: python
......@@ -61,15 +62,15 @@ PaddlePaddle提供了data算子来描述输入数据的格式。data算子的输
优化方法
--------
确定损失函数后,可以通过前向计算得到损失值,然后通过链式求导法则得到参数的梯度值。获取梯度值后需要更新参数,最简单的算法是随机梯度下降法::math:`w=w + \eta \cdot g`,但是随机梯度下降算法存在一些问题,比如收敛不稳定等,为了改善模型的训练速度以及效果,学术界先后提出了很多优化算法,包括:Momentum、RMSProp、Adam等,这些优化算法采用不同的策略来更新模型参数,一般可以针对具体任务和具体模型来选择优化算法。不管使用何种优化算法,学习率一般是一个需要指定的比较重要的超参数,需要通过实验仔细调整,这里采用随机梯度下降算法:
确定损失函数后,可以通过前向计算得到损失值,然后通过链式求导法则得到参数的梯度值。获取梯度值后需要更新参数,最简单的算法是随机梯度下降法::math:`w=w - \eta \cdot g`。但是随机梯度下降算法存在一些问题,比如收敛不稳定等,为了改善模型的训练速度以及效果,学术界先后提出了很多优化算法,包括: :code:`Momentum`、:code:`RMSProp`、:code:`Adam` 等。这些优化算法采用不同的策略来更新模型参数,一般可以针对具体任务和具体模型来选择优化算法。不管使用何种优化算法,学习率一般是一个需要指定的比较重要的超参数,需要通过实验仔细调整。这里采用随机梯度下降算法:
.. code-block:: python
sgd_optimizer = fluid.optimizer.SGD(learning_rate=0.001)
更多优化算子可以参考 `optimizer <http://www.paddlepaddle.org/docs/develop/api/fluid/en/optimizer.html>`_
更多优化算子可以参考 :ref:`api_fluid_optimizer`
总结
####
下一步做什么?
##############
使用PaddlePaddle实现模型时需要关注 **数据层**、**前向计算逻辑**、**损失函数** 和 **优化方法**,不同的任务需要的数据格式不同,涉及的计算逻辑不同,需要特定的损失函数,适用的优化方法也有所差别。PaddlePaddle提供了丰富的模型示例,可以以这些示例为参考来构建自己的模型结构。可以访问 `模型库 <https://github.com/PaddlePaddle/models/tree/develop/fluid>`_ 查看官方提供的示例。
使用PaddlePaddle实现模型时需要关注 **数据层**、**前向计算逻辑**、**损失函数** 和 **优化方法**。不同的任务需要的数据格式不同,涉及的计算逻辑不同。用户需要指定特定的损失函数。不同模型适用的优化方法。PaddlePaddle提供了丰富的模型示例,可以以这些示例为参考来构建自己的模型结构。可以访问 `模型库 <https://github.com/PaddlePaddle/models/tree/develop/fluid>`_ 查看官方提供的示例。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册