diff --git a/docs/soft/ai/zh/basic/dnn_basic.md b/docs/soft/ai/zh/basic/dnn_basic.md index f85bc2238e..0a905477a2 100644 --- a/docs/soft/ai/zh/basic/dnn_basic.md +++ b/docs/soft/ai/zh/basic/dnn_basic.md @@ -25,7 +25,7 @@ update_open: false ![y=kx+b](../../assets/dnn/ykxb.jpg) 现在提问,假如数据点规律不变, 输入一个 x 坐标 20, y 的值是多少? -按照大家的知识,都知道这是一个一元一次方程(`y = kx + b`能解决的, 带入两个点的值,算出方程为`y = 3x + 10`, 那么当 `x=20`, `y` 的值为`70`, 于是输入是`20`, 输出是`70`。 +按照大家的知识,都知道这是一个一元一次方程(`y = kx + b`)能解决的, 带入两个点的值,算出方程为`y = 3x + 10`, 那么当 `x=20`, `y` 的值为`70`, 于是输入是`20`, 输出是`70`。 这里就是 输入(`20`) + 算法(一元一次方程) = 输出(`70`), 这就是我们在解决一个问题时的基本方法, 所以关键就是找到这个符合这条线段上数据点规律的一个算法。 @@ -44,13 +44,13 @@ update_open: false 那么,机器学习是不是也可以利用这个步骤来做呢? -* 我们认为地设计一个算法结构, 加入我们碰巧直接设计成了`y = kx + b`, 我们给具体的直线留下了两个参数,我们暂且称呼这个结构叫 **模型结构**,因为有未知参数,我们称之为未训练的模型结构。其中`x`称为**输入**, `y`称为**输出** +* 我们人为地设计一个算法结构, 假如我们碰巧直接设计成了`y = kx + b`, 我们给具体的直线留下了两个参数,我们暂且称呼这个结构叫 **模型结构**,因为有未知参数,我们称之为未训练的模型结构。其中`x`称为**输入**, `y`称为**输出** -* 现在,我们将我们这条直线的的几个点代入到这个方程, 我们称这个过程为 **训练**,得到`y = 3x + 10` 这个算法, 已经没有未知参数了, 我们现在称它为**模型** 或者 训练好的模型,其中`k b`是模型内的参数,`y = kx + b`是这个模型的结构。 而带入训练的数据点,就叫做**训练数据**,它们的统称就叫**训练数据集** +* 现在,我们将我们这条直线的几个点代入到这个方程, 我们称这个过程为 **训练**,得到`y = 3x + 10` 这个算法, 已经没有未知参数了, 我们现在称它为**模型** 或者 训练好的模型,其中`k b`是模型内的参数,`y = kx + b`是这个模型的结构。 而带入训练的数据点,就叫做**训练数据**,它们的统称就叫**训练数据集** * 然后,我们使用几个在 训练 过程中没有用到的在线段上的数据点作为输入,代入这个模型进行运算,得到结果,比如 `x = 10`, 得到`y = 40`, 然后对比输出值是否与预期相符,这里我们发现`x = 10, y = 40` 确实是在图中这条直线上的, 并且训练时没有使用这个点,说明我们得到的模型在此次核验中通过,这个过程叫 **验证**, `x = 10, y = 40` 这个数据叫验证数据。 如果我们用多组数据去验证这个模型, 这些数据的统称就叫**验证数据集** -* 现在, 我们获得了一个**模型**,并且用**验证数据集**对这个模型进行了验证,貌似也是很准确了,那我们就可以假设这个模型基本满足了我们以后有一个`x`, 要求着图中线上任意一点的`y`值,都可以输入`x`给出这条直线上对应点的`y`坐标。 这个过程我们其实是在**使用模型**了,这个过程称之为**推理** +* 现在, 我们获得了一个**模型**,并且用**验证数据集**对这个模型进行了验证,貌似也是很准确了,那我们就可以假设这个模型基本满足了我们以后的需求:有一个`x`, 要求图中线上任意一点的`y`值,都可以输入`x`给出这条直线上对应点的`y`坐标。 这个过程我们其实是在**使用模型**了,这个过程称之为**推理** 其实这就算是机器学习了, 我们人类需要的事就是设计`y = kx + b`这个结构,以及给出**训练数据集**和**验证数据集**,经过**训练**和**验证**得到一个我们认为可用的模型,然后使用`输入 + 模型`就可以得到认为的正确`输出(结果)`了。 @@ -132,7 +132,7 @@ update_open: false **激活函数**: -上面的模型虽然可以通过输入得到结果,但是会发现,所有层计算都是线性函数,那么不管有多少层,整体其实还是一个线性函数,即`y0 = w1x + b1` + `y = w2y0 + b2` ==> `y = w2(w1x + b1) + b2` ==> `y = w2w1x + w2b1 + b2`, 其实还是一个线性函数,那么多层的意义就没有了,于是我们需要在中间加入非线性函数,让网络内部更加复杂一点, 于是就在每个节点上做手脚, 在每个节点输出数据前,先对其用一个非线性函数运算,比如`sigmod`或者`relu`函数,别听到名字害怕,其实很简单,看下图, 总之就是 x 和 y 不成线性关系: +上面的模型虽然可以通过输入得到结果,但是会发现,所有层计算都是线性函数,那么不管有多少层,整体其实还是一个线性函数,即`y0 = w1x + b1` + `y = w2y0 + b2` ==> `y = w2(w1x + b1) + b2` ==> `y = w2w1x + w2b1 + b2`, 其实还是一个线性函数,那么多层的意义就没有了,于是我们需要在中间加入非线性函数,让网络内部更加复杂一点, 于是就在每个节点上做手脚, 在每个节点输出数据前,先对其用一个非线性函数运算,比如`sigmoid`或者`relu`函数,别听到名字害怕,其实很简单,看下图, 总之就是 x 和 y 不成线性关系: ![sigmod](../../assets/dnn/sigmod.jpg) ![relu](../../assets/dnn/relu.jpg) 即到现在为止, 除了输入层,所有节点输出的值都需要经过`Sigmod(∑(Wn * x + Bn))`, 输出一个浮点数值