Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions docs/soft/ai/zh/basic/dnn_basic.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`), 这就是我们在解决一个问题时的基本方法, 所以关键就是找到这个符合这条线段上数据点规律的一个算法。

Expand All @@ -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`这个结构,以及给出**训练数据集**和**验证数据集**,经过**训练**和**验证**得到一个我们认为可用的模型,然后使用`输入 + 模型`就可以得到认为的正确`输出(结果)`了。

Expand Down Expand Up @@ -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))`, 输出一个浮点数值
Expand Down