神经网络变得轻松(第十一部分):自 GPT 获取(基础篇)
📘

神经网络变得轻松(第十一部分):自 GPT 获取(基础篇)

第 1/3 篇

「在 MT5 里接住 GPT 的输出」

把 GPT 这类生成式模型塞进 MetaTrader 5,核心不是重写网络,而是让终端能拿到模型吐出的文本或向量并转成交易信号。2021 年 4 月那篇实测文里,作者用 3400 行量级的示例工程验证了从外部进程取数的可行性,社区互动数停在 10 条左右,说明当时跑通的人不多。 MT5 本身不原生跑大模型,常规做法是开一个本地 HTTP 服务把 GPT 的回答桥接进 EA。下面这段是原文里最关键的请求骨架,负责把提示词发到本地代理并读回结果。 真正落地时,先把模型推理放在 Python 侧,EA 只做两件事:发请求、解析返回。外汇与贵金属杠杆高、滑点随机,任何由文本模型生成的倾向都只能当概率参考,不能直接当下单指令。

MQL5 / C++
class="type">class="kw">string SendToGPT(class="type">class="kw">string prompt)
{
   class="type">class="kw">string headers="Content-Type: application/json";
   class="type">class="kw">string data="{\"text\":\""+prompt+"\"}";
   class="type">char post[],result[];
   StringToCharArray(data,post);
   class="type">int res=WebRequest("POST","http:class=class="str">"cmt">//localhost:class="num">8080/gpt",headers,post,result);
   if(res==class="num">200) class="kw">return CharArrayToString(result);
   class="kw">return "";
}

先看清这篇技术文的骨架

读一篇讲 GPT 在 MQL5 里落地的长文,先扫一眼它的目录能省掉一半摸索时间。原文把内容切成概述、模型理解、与旧变换器的差异、实现细节、测试与收尾几块,实现部分又拆成新建类、前馈、反馈和基类改动四个子项。 对交易者来说,最有用的往往是「实现」和「测试」两节——前者给你能粘贴进 MT5 的代码骨架,后者告诉你这套东西在历史数据上跑出来什么现象。其余像概述和参考,属于背景铺垫,跳读不影响你动手验证。 如果后续你只想复现效果,直接定位到「3. 实现」下的四个子小节和「4. 测试」,其余章节当索引备查即可。

◍ 大模型演进里的算力门槛

  • 年 6 月 OpenAI 放出 GPT 初代,随后 GPT-2 在 2019 年、GPT-3 在 2020 年 5 月相继出现,语言生成能力在多项测试里表现突出,同期还有团队验证过音乐与图像的生成可行性。

这类模型最硬的瓶颈不在算法,而在算力消耗:初代 GPT 用 8 张 GPU 训满一个月才跑完,对普通交易者来说这是无法本地复现的成本。 折中办法是拿预训练模型做迁移,能补一部分从零训练的缺口,但模型体量摆在那,推理和维持运行照样要吃大量资源,外汇和贵金属行情的高频场景里这点很致命,实盘部署前务必评估服务器开销与断线风险。

「GPT 的两阶段训练到底在省什么」

GPT 的底座是 Transformer,但它真正落地靠的是「先无监督、后微调」的两段式训练。先拿海量无标注文本做预训练,让模型学到语言统计结构;再拿少量人工标注样本做监督微调,把通用语言能力压到具体任务上。 这么做不是玄学,是参数规模逼出来的。现代类 GPT 深度模型参数量能到数亿级,GPT-3 更是 1750 亿参数、在 570GB 数据上预训练。监督学习要人工打标,样本贵且慢;网上无标注文本随便抓,但纯无监督效果统计上差一大截,所以才用「少量标注补一刀」的折中。 预训练让模型拿到语言基模,微调只调任务头,同一份底座能复制去跑不同语言任务。实践上泛化不错,GPT-3 能就给定主题吐出连贯文本。 理论上只要有无监督预训练所需的数据和资源,GPT 不挑模态——自然语言、音乐、图像序列都能喂,前提是数字化且量够。外汇贵金属行情序列若想套这类思路,先掂量本地算力和数据储备,高频序列过拟合风险高。

GPT 为什么只用解码器

GPT 和传统变换器最直观的分叉点在于结构:它砍掉了编码器,只保留解码器堆叠。没有编码器,就意味着不存在“编码器-解码器自关注”那一层内部计算,模块之间只剩解码器自身的关注链路。 模块是逐层往上摞的,每一层都有独立的关注权重矩阵和全连接前馈网络。堆多少层基本决定了模型体量——GPT-1 和最小的 GPT-2(小型)是 12 层,GPT-2 特大型到了 48 层,GPT-3 则拉到 96 层,规模差异直接体现在层数上。 它属于自回归模型,每次迭代只吐一个序列令牌,新令牌被塞回输入再跑下一轮。和能看未来的结构不同,GPT 不能窥视序列后方,但它不靠掩码挡未来,而是把 Score 矩阵里后续元素的关注比率直接重置掉。 自关注里每个令牌仍生成 query、key、value 三个向量。因为每次迭代输入只多一个令牌,已算过的向量不用重算,每一层只在序列冒出新元素时才补算,模块把向量存着留待后续用。多目击者关注机制也照常保留,所以它能逐词往外蹦文本,直到收到终止令牌。

◍ 把多目击者自关注塞进一个 OpenCL 类

GPT 用的变换器是同一套超参数、同一结构、只换训练矩阵的堆栈,所以这次没有沿用第十部分里写死的 CNeuronMHAttentionOCL,而是新开 CNeuronMLMHAttentionOCL,把层数、目击者数、窗口大小都做成构造参数。类保护区里只留 5 个整形超参:iLayers(模块数)、iHeads(目击者数)、iWindow(输入令牌窗口)、iWindowKey(Q/K/V 内部维度)、iUnits(序列元素数),以及 6 个缓冲数组装 QKV、权重、Score、Attention 输出和前馈张量。 Init 方法接收 window、window_key、heads、units_count、layers 等参数,父类校验完 OpenCL 指针和序列尺寸后,把超参存进变量。关键点在于 QKV 不再按目击者拆数组,而是合并到一张大张量里按索引切分——可读性变差,但能直接在 GPU 内核级并行所有目击者。张量尺寸按 (3 × window_key × heads) 起算,权重矩阵按输入令牌三维乘偏移递增加头数,循环建层时为最后一层复用父类输出指针,省掉一次内存拷贝。 前馈里 feedForward 按层循环,每轮调 ConvolutionForward 算 QKV,再调 AttentionScore 和 AttentionOut。实测踩过 ERR_OPENCL_TOO_MANY_OBJECTS(5113)的坑,根因是张量全留 GPU 显存、释放后没回读最后数据,所以代码里释放缓冲前必须先把结果从 GPU 读回。AttentionScore 内核在序列维和目击者维双维度并行,对后续令牌置零分数,再用 SoftMax 对 query 上下文归一,所有分数合计为 1;AttentionOut 则用 Score 乘 value 并加回输入做残差。 反馈分两条:calcInputGradients 反向按层倒序传梯度,updateInputWeights 按 SGD 或 Adam 更新 W0 与 FF 权重。Adam 比 SGD 多存一套第二动量矩阵,类里已按层预留。整体看,这套实现把 4 头硬编码改成了 heads 参数驱动,想验证就开 MT5 把 iHeads 从 4 改成 8 跑同一段序列,显存占用和耗时变化能直接比对。外汇与贵金属模型训练涉及高杠杆与样本漂移风险,参数改动前请先用历史片段小批量试跑。

常见问题

先确认本地程序能发起网络请求并解析 JSON,再写一个小函数把返回字段映射到界面变量,别一上来就接完整对话。
先找文章的模块切分和输入输出定义,把代码骨架抄一遍跑通空壳,再填具体算法,比从头精读省时间。
小布可以替你跑通接文本返回的基础流程,并把多步解析做成现成看板,你只管看结果和调整参数。
因为它们多把训练拆成预训练加微调两阶段,先用海量文本学通用语言,再少量数据调任务,重复算力投入少。
先用云端小参数版本验证想法,把重计算放远程,本地只留轻量解析,避免一开机就爆内存。