我正在深入研究神经网络的机器学习,在阅读了一些理论并研究火炬之后,我现在想用一个神经网络来研究一个具有未知模型的简单直升机需要产生多少推力才能悬停在放置在参考高度。
我有一个控制背景,我知道通常不会使用神经网络或机器学习,但我认为这是一个很好的首要任务。
我认为我所需要的只是一个简单的线性回归(以NN形式)来学习将测量高度映射到推力的功能(产生恰当的推力以抵消参考高度处的重力)。
但这似乎有点复杂。假设我有一个简单的动力学模拟器,并且我每fs
赫兹给出一个高度测量值。我对我的模型进行了正向传递(参见下面的模型代码)来计算模型的推力。到现在为止还挺好。然而,效果不会立即可见,因此使用当前测量值来执行损失函数的前向和后向传递似乎是错误的。或者是吗?
所以最终问题是:我可以用我提出的简单线性回归解决所述问题,或者我需要更复杂的东西来捕捉模型的“响应时间”。
require 'torch'
require 'nn'
local model = nn.Sequential()
model:add(nn.Linear(1, 1)) -- Simple linear regression with one input (measured height) and one output (thrust)
local criterion = nn.MSECriterion -- Simple mean squared error loss function.
heigh_ref = 1
function height_measurement_callback(height_meas)
local thrust = model:forward(height_meas)
criterion:forward(height_meas, heigh_ref) -- ??
local grad = criterion:backward(height_meas, heigh_ref) -- ??
model:backward(height_meas, grad) -- ??
return thrust
end
答案 0 :(得分:1)
问题:设置特定高度h_desired
并让程序找到相应的推力值。假设推力和高度之间存在一对一的对应关系。
理性解决方案:根据高度之间的当前差异调整推力,以最小化h_desired - h_current
。
机器学习解决方案:进行一系列测量,对其进行回归,尝试使用获得的模型预测新值,验证预测,将实际值添加到训练集中。
假设“NN的前向路径”是计算预测值与实际值的偏差:delta_i=(y_predicted_i - y_observed_i)
,后向传递是k
和{{1}的计算在b
中,没有必要将它们分开。实际上我很难想到在这些操作之间做任何合理的事情。
现在使用更新的模型,您可以预测推力的新值,它可以使您达到所需的高度,然后进行新的测量,设置新的推力值并查看它对应的高度值。显然,您必须等到直升机停止移动,然后将新的推力 - 高度对放入训练数据并进行下一次线性回归迭代。这不是关于“神经网络模型”,而是关于数据采集过程。你不应该把它们混淆在一起。在将数据添加到模型体验之前,您必须始终完成测量。