462. Google Brain - Ventilator Pressure Prediction | ventilator-pressure-prediction
输入 u_in 是通过比例-积分-微分(PID)方法控制的,与目标测量压力呈线性关系。组织者在其论文 [1] 中解释说,他们这样做是出于安全原因,以避免任意输入。我逆向推导了这个映射,并获得了大约 30% 数据的精确值。对于剩下的 70% 数据,我没有自己强有力的模型,这一定是我与第2名和第3名队伍的差距所在。
由于我的技术与现有的第1名方案有很大重叠,我从个人的回忆开始讲起;具体技术在下一节。
起初我认为这是一个物理时间演化问题,并尝试了一些常微分方程类型的循环网络 dq/dt = F(q, u_in)。这种方法记住了过去,但没有使用未来的 u_in,我得到的分数只有 0.5 左右。
虽然 @hengck23 在早期阶段就提出了这个问题,但我假设 u_in 是一个固定的函数,认为在一个预测 p 的比赛中使用测量压力来计算 u_in 是没有意义的。直到截止日期前大约一周,我才从这种(看似合理的)偏见中解脱出来。不知道为什么,我很长一段时间都忘了读组织者的论文。
有一天,我将问题简化为仅预测 p[1] 或 p[1] - p[0],并意识到 LSTM 模型预测 p[0] 极其准确。从 u[0]、R 和 C,我们只能预测大约 0.5 的 MAE 误差,但 LSTM 模型可以轻松达到 0.15。
@rajkumarsinghakonwar 和 @pcjimmmy 之前已经有精彩的问答,但直到我自己发现这一点之前,我并没有意识到。
我继续认为 u_in 是固定的,并寻找可能来自实验设备或条件的某种魔法,例如当天的大气压或温度。大约一周前,我终于读了论文并了解了 PID 控制。
PID 控制器有一个目标压力 p*,输入与误差 e = p* - p 和误差的积分成正比,其中 p 是我们要寻找的目标变量:
e[t] = p* - p[t]
u_in[t] = Kp e + Ki I[t]
在本次比赛中,目标值是常数,Kp 和 Ki 是常数参数。PID 中的微分项“D”在数据中未被使用。
一个重要的技术细节是,积分实际上是一个具有指数衰减的移动平均值 [2]:
dt[t] = time[t+1] - t[t]
s[t] = dt[t] / (dt[t] + rc)
I[t] = (1 - s[t-1]) I[t-1] + s[t-1] e[t]
rc = 0.5,在源代码 [2] 中是 0.3,但在这里看起来是 0.5。
虽然 PID 控制极其简单,但反转 u_in(p) 并非易事。常数并不唯一,且初始积分 I[0] 并不总是重置为 0(似乎大约 1/5 是 0)。我利用了 Kp、Ki、p* 和 p 的离散性,这些在论文中写明了,但也可以从训练数据中测量出来。
for all Kp, Kp, p*, and, p[1]:
solve for I[0] using the equations above
solve p[t] iteratively from I[0]
我用 C++ 编写了嵌套循环,对所有测试数据的暴力破解只需 5 分钟。
并非所有的 p[t] 都能被精确求解: