[{"data":1,"prerenderedAt":821},["ShallowReactive",2],{"article-ai\u002Fai-drug-week05-morgan-mlp":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"date":10,"tags":11,"listed":15,"body":16,"_type":815,"_id":816,"_source":817,"_file":818,"_stem":819,"_extension":820},"\u002Farticles\u002Fai\u002Fai-drug-week05-morgan-mlp","ai",false,"","第 5 周：Morgan Fingerprint 和 MLP 的第一次模型对比","记录用 Morgan Fingerprint 训练 MLP，并和第 4 周 RandomForest baseline 做 ESOL 水溶解度预测对比。","2026-06-03",[12,13,14],"AI制药","深度学习","人工智能",true,{"type":17,"children":18,"toc":808},"root",[19,27,33,193,198,203,208,213,218,289,294,301,306,329,334,339,345,350,420,463,483,489,494,508,513,568,587,592,626,631,636,641,654,659,744,749,754,759,764,769,774,797,802],{"type":20,"tag":21,"props":22,"children":24},"element","h1",{"id":23},"前情提要",[25],{"type":26,"value":23},"text",{"type":20,"tag":28,"props":29,"children":30},"p",{},[31],{"type":26,"value":32},"正在做一个AI制药平台项目，前端使用vue3、后端采用双后端(主后端Java、SpringBoot做业务，次后端Python、FastAPI做AI服务)",{"type":20,"tag":34,"props":35,"children":39},"pre",{"className":36,"code":37,"language":38,"meta":7,"style":7},"language-plain shiki shiki-themes github-dark","Vue3 前端\n  |\n  | REST API\n  v\nSpringBoot 主后端\n  |\n  | 任务管理 \u002F 数据管理\n  v\nPostgreSQL + Redis\n  |\n  | 调用\n  v\nPython AI Service\n  |\n  | RDKit \u002F PyTorch \u002F PyG \u002F scikit-learn\n  v\n模型推理与分子计算\n","plain",[40],{"type":20,"tag":41,"props":42,"children":43},"code",{"__ignoreMap":7},[44,55,64,73,82,91,99,108,116,125,133,142,150,159,167,176,184],{"type":20,"tag":45,"props":46,"children":49},"span",{"class":47,"line":48},"line",1,[50],{"type":20,"tag":45,"props":51,"children":52},{},[53],{"type":26,"value":54},"Vue3 前端\n",{"type":20,"tag":45,"props":56,"children":58},{"class":47,"line":57},2,[59],{"type":20,"tag":45,"props":60,"children":61},{},[62],{"type":26,"value":63},"  |\n",{"type":20,"tag":45,"props":65,"children":67},{"class":47,"line":66},3,[68],{"type":20,"tag":45,"props":69,"children":70},{},[71],{"type":26,"value":72},"  | REST API\n",{"type":20,"tag":45,"props":74,"children":76},{"class":47,"line":75},4,[77],{"type":20,"tag":45,"props":78,"children":79},{},[80],{"type":26,"value":81},"  v\n",{"type":20,"tag":45,"props":83,"children":85},{"class":47,"line":84},5,[86],{"type":20,"tag":45,"props":87,"children":88},{},[89],{"type":26,"value":90},"SpringBoot 主后端\n",{"type":20,"tag":45,"props":92,"children":94},{"class":47,"line":93},6,[95],{"type":20,"tag":45,"props":96,"children":97},{},[98],{"type":26,"value":63},{"type":20,"tag":45,"props":100,"children":102},{"class":47,"line":101},7,[103],{"type":20,"tag":45,"props":104,"children":105},{},[106],{"type":26,"value":107},"  | 任务管理 \u002F 数据管理\n",{"type":20,"tag":45,"props":109,"children":111},{"class":47,"line":110},8,[112],{"type":20,"tag":45,"props":113,"children":114},{},[115],{"type":26,"value":81},{"type":20,"tag":45,"props":117,"children":119},{"class":47,"line":118},9,[120],{"type":20,"tag":45,"props":121,"children":122},{},[123],{"type":26,"value":124},"PostgreSQL + Redis\n",{"type":20,"tag":45,"props":126,"children":128},{"class":47,"line":127},10,[129],{"type":20,"tag":45,"props":130,"children":131},{},[132],{"type":26,"value":63},{"type":20,"tag":45,"props":134,"children":136},{"class":47,"line":135},11,[137],{"type":20,"tag":45,"props":138,"children":139},{},[140],{"type":26,"value":141},"  | 调用\n",{"type":20,"tag":45,"props":143,"children":145},{"class":47,"line":144},12,[146],{"type":20,"tag":45,"props":147,"children":148},{},[149],{"type":26,"value":81},{"type":20,"tag":45,"props":151,"children":153},{"class":47,"line":152},13,[154],{"type":20,"tag":45,"props":155,"children":156},{},[157],{"type":26,"value":158},"Python AI Service\n",{"type":20,"tag":45,"props":160,"children":162},{"class":47,"line":161},14,[163],{"type":20,"tag":45,"props":164,"children":165},{},[166],{"type":26,"value":63},{"type":20,"tag":45,"props":168,"children":170},{"class":47,"line":169},15,[171],{"type":20,"tag":45,"props":172,"children":173},{},[174],{"type":26,"value":175},"  | RDKit \u002F PyTorch \u002F PyG \u002F scikit-learn\n",{"type":20,"tag":45,"props":177,"children":179},{"class":47,"line":178},16,[180],{"type":20,"tag":45,"props":181,"children":182},{},[183],{"type":26,"value":81},{"type":20,"tag":45,"props":185,"children":187},{"class":47,"line":186},17,[188],{"type":20,"tag":45,"props":189,"children":190},{},[191],{"type":26,"value":192},"模型推理与分子计算\n",{"type":20,"tag":28,"props":194,"children":195},{},[196],{"type":26,"value":197},"会把自己认为比较重要的部分，单独写成文章以便记录。写这个项目的主要目的是以赛代练，因为不想从头到尾啃生物信息学、生物化学原理这些AI制药理论。通过项目能快速理解核心概念，剩下零零散散的后续慢慢补。",{"type":20,"tag":28,"props":199,"children":200},{},[201],{"type":26,"value":202},"此篇就是第 5 周的记录。",{"type":20,"tag":21,"props":204,"children":206},{"id":205},"第-5-周morgan-fingerprint-和-mlp-的第一次模型对比",[207],{"type":26,"value":8},{"type":20,"tag":28,"props":209,"children":210},{},[211],{"type":26,"value":212},"第 5 周的重点是把 PyTorch 训练流程接进分子预测任务。输入特征从上一周的 RDKit descriptors 换成 Morgan Fingerprint，模型从 RandomForest 换成 MLP。",{"type":20,"tag":28,"props":214,"children":215},{},[216],{"type":26,"value":217},"这周跑通的链路是：",{"type":20,"tag":34,"props":219,"children":221},{"className":36,"code":220,"language":38,"meta":7,"style":7},"ESOL CSV\n-> SMILES\n-> Morgan Fingerprint\n-> Dataset \u002F DataLoader\n-> MLP\n-> loss curve\n-> metrics\n-> model checkpoint\n",[222],{"type":20,"tag":41,"props":223,"children":224},{"__ignoreMap":7},[225,233,241,249,257,265,273,281],{"type":20,"tag":45,"props":226,"children":227},{"class":47,"line":48},[228],{"type":20,"tag":45,"props":229,"children":230},{},[231],{"type":26,"value":232},"ESOL CSV\n",{"type":20,"tag":45,"props":234,"children":235},{"class":47,"line":57},[236],{"type":20,"tag":45,"props":237,"children":238},{},[239],{"type":26,"value":240},"-> SMILES\n",{"type":20,"tag":45,"props":242,"children":243},{"class":47,"line":66},[244],{"type":20,"tag":45,"props":245,"children":246},{},[247],{"type":26,"value":248},"-> Morgan Fingerprint\n",{"type":20,"tag":45,"props":250,"children":251},{"class":47,"line":75},[252],{"type":20,"tag":45,"props":253,"children":254},{},[255],{"type":26,"value":256},"-> Dataset \u002F DataLoader\n",{"type":20,"tag":45,"props":258,"children":259},{"class":47,"line":84},[260],{"type":20,"tag":45,"props":261,"children":262},{},[263],{"type":26,"value":264},"-> MLP\n",{"type":20,"tag":45,"props":266,"children":267},{"class":47,"line":93},[268],{"type":20,"tag":45,"props":269,"children":270},{},[271],{"type":26,"value":272},"-> loss curve\n",{"type":20,"tag":45,"props":274,"children":275},{"class":47,"line":101},[276],{"type":20,"tag":45,"props":277,"children":278},{},[279],{"type":26,"value":280},"-> metrics\n",{"type":20,"tag":45,"props":282,"children":283},{"class":47,"line":110},[284],{"type":20,"tag":45,"props":285,"children":286},{},[287],{"type":26,"value":288},"-> model checkpoint\n",{"type":20,"tag":28,"props":290,"children":291},{},[292],{"type":26,"value":293},"它看起来比第 4 周复杂很多，但最后的结果反而提醒我：复杂模型不一定自动带来更好的效果。",{"type":20,"tag":295,"props":296,"children":298},"h2",{"id":297},"morgan-fingerprint-作为输入",[299],{"type":26,"value":300},"Morgan Fingerprint 作为输入",{"type":20,"tag":28,"props":302,"children":303},{},[304],{"type":26,"value":305},"Morgan Fingerprint 可以理解成一种固定长度的分子结构编码。它把分子局部结构转成 bit vector，常见配置是：",{"type":20,"tag":34,"props":307,"children":309},{"className":36,"code":308,"language":38,"meta":7,"style":7},"radius = 2\nn_bits = 2048\n",[310],{"type":20,"tag":41,"props":311,"children":312},{"__ignoreMap":7},[313,321],{"type":20,"tag":45,"props":314,"children":315},{"class":47,"line":48},[316],{"type":20,"tag":45,"props":317,"children":318},{},[319],{"type":26,"value":320},"radius = 2\n",{"type":20,"tag":45,"props":322,"children":323},{"class":47,"line":57},[324],{"type":20,"tag":45,"props":325,"children":326},{},[327],{"type":26,"value":328},"n_bits = 2048\n",{"type":20,"tag":28,"props":330,"children":331},{},[332],{"type":26,"value":333},"相比 RDKit descriptors，fingerprint 的维度更高，也更像“结构模式”的集合。它不直接告诉我分子量、极性表面积这些人工描述符，而是用 bit 位表达某些子结构是否出现。",{"type":20,"tag":28,"props":335,"children":336},{},[337],{"type":26,"value":338},"这一点很适合接 MLP。MLP 可以在高维稀疏特征上学习组合模式，但前提是数据量、正则化和划分方式都要站得住。",{"type":20,"tag":295,"props":340,"children":342},{"id":341},"mlp-结构",[343],{"type":26,"value":344},"MLP 结构",{"type":20,"tag":28,"props":346,"children":347},{},[348],{"type":26,"value":349},"这一版模型没有做复杂设计：",{"type":20,"tag":34,"props":351,"children":353},{"className":36,"code":352,"language":38,"meta":7,"style":7},"2048-bit Morgan fingerprint\n-> Linear(2048, 256)\n-> ReLU\n-> Dropout(0.1)\n-> Linear(256, 64)\n-> ReLU\n-> Linear(64, 1)\n-> predicted logS\n",[354],{"type":20,"tag":41,"props":355,"children":356},{"__ignoreMap":7},[357,365,373,381,389,397,404,412],{"type":20,"tag":45,"props":358,"children":359},{"class":47,"line":48},[360],{"type":20,"tag":45,"props":361,"children":362},{},[363],{"type":26,"value":364},"2048-bit Morgan fingerprint\n",{"type":20,"tag":45,"props":366,"children":367},{"class":47,"line":57},[368],{"type":20,"tag":45,"props":369,"children":370},{},[371],{"type":26,"value":372},"-> Linear(2048, 256)\n",{"type":20,"tag":45,"props":374,"children":375},{"class":47,"line":66},[376],{"type":20,"tag":45,"props":377,"children":378},{},[379],{"type":26,"value":380},"-> ReLU\n",{"type":20,"tag":45,"props":382,"children":383},{"class":47,"line":75},[384],{"type":20,"tag":45,"props":385,"children":386},{},[387],{"type":26,"value":388},"-> Dropout(0.1)\n",{"type":20,"tag":45,"props":390,"children":391},{"class":47,"line":84},[392],{"type":20,"tag":45,"props":393,"children":394},{},[395],{"type":26,"value":396},"-> Linear(256, 64)\n",{"type":20,"tag":45,"props":398,"children":399},{"class":47,"line":93},[400],{"type":20,"tag":45,"props":401,"children":402},{},[403],{"type":26,"value":380},{"type":20,"tag":45,"props":405,"children":406},{"class":47,"line":101},[407],{"type":20,"tag":45,"props":408,"children":409},{},[410],{"type":26,"value":411},"-> Linear(64, 1)\n",{"type":20,"tag":45,"props":413,"children":414},{"class":47,"line":110},[415],{"type":20,"tag":45,"props":416,"children":417},{},[418],{"type":26,"value":419},"-> predicted logS\n",{"type":20,"tag":28,"props":421,"children":422},{},[423,425,431,433,439,441,446,448,454,456,461],{"type":26,"value":424},"ESOL 是回归任务，输出是连续的 ",{"type":20,"tag":41,"props":426,"children":428},{"className":427},[],[429],{"type":26,"value":430},"logS",{"type":26,"value":432},"，所以最后一层保持线性输出，不加 ",{"type":20,"tag":41,"props":434,"children":436},{"className":435},[],[437],{"type":26,"value":438},"sigmoid",{"type":26,"value":440},"。如果加了 ",{"type":20,"tag":41,"props":442,"children":444},{"className":443},[],[445],{"type":26,"value":438},{"type":26,"value":447},"，输出会被压到 ",{"type":20,"tag":41,"props":449,"children":451},{"className":450},[],[452],{"type":26,"value":453},"[0, 1]",{"type":26,"value":455},"，而 ",{"type":20,"tag":41,"props":457,"children":459},{"className":458},[],[460],{"type":26,"value":430},{"type":26,"value":462}," 本身并不在这个范围内。",{"type":20,"tag":28,"props":464,"children":465},{},[466,468,474,476,481],{"type":26,"value":467},"训练时使用 ",{"type":20,"tag":41,"props":469,"children":471},{"className":470},[],[472],{"type":26,"value":473},"MSELoss",{"type":26,"value":475},"。目标值先根据训练集均值和标准差做标准化，评估 MAE、RMSE、R2 时再还原到原始 ",{"type":20,"tag":41,"props":477,"children":479},{"className":478},[],[480],{"type":26,"value":430},{"type":26,"value":482}," 尺度。",{"type":20,"tag":295,"props":484,"children":486},{"id":485},"pytorch-训练闭环",[487],{"type":26,"value":488},"PyTorch 训练闭环",{"type":20,"tag":28,"props":490,"children":491},{},[492],{"type":26,"value":493},"核心脚本是：",{"type":20,"tag":34,"props":495,"children":497},{"className":36,"code":496,"language":38,"meta":7,"style":7},"ml-experiments\u002Fesol_mlp.py\n",[498],{"type":20,"tag":41,"props":499,"children":500},{"__ignoreMap":7},[501],{"type":20,"tag":45,"props":502,"children":503},{"class":47,"line":48},[504],{"type":20,"tag":45,"props":505,"children":506},{},[507],{"type":26,"value":496},{"type":20,"tag":28,"props":509,"children":510},{},[511],{"type":26,"value":512},"新增输出包括：",{"type":20,"tag":34,"props":514,"children":516},{"className":36,"code":515,"language":38,"meta":7,"style":7},"models\u002Fesol_mlp.pt\nml-experiments\u002Foutputs\u002Fesol_mlp_metrics.json\nml-experiments\u002Foutputs\u002Fesol_mlp_predictions.csv\nml-experiments\u002Foutputs\u002Fesol_mlp_training_log.csv\nml-experiments\u002Foutputs\u002Ffigures\u002Fesol_mlp_loss_curve.png\nml-experiments\u002Freports\u002Fesol_model_compare.md\n",[517],{"type":20,"tag":41,"props":518,"children":519},{"__ignoreMap":7},[520,528,536,544,552,560],{"type":20,"tag":45,"props":521,"children":522},{"class":47,"line":48},[523],{"type":20,"tag":45,"props":524,"children":525},{},[526],{"type":26,"value":527},"models\u002Fesol_mlp.pt\n",{"type":20,"tag":45,"props":529,"children":530},{"class":47,"line":57},[531],{"type":20,"tag":45,"props":532,"children":533},{},[534],{"type":26,"value":535},"ml-experiments\u002Foutputs\u002Fesol_mlp_metrics.json\n",{"type":20,"tag":45,"props":537,"children":538},{"class":47,"line":66},[539],{"type":20,"tag":45,"props":540,"children":541},{},[542],{"type":26,"value":543},"ml-experiments\u002Foutputs\u002Fesol_mlp_predictions.csv\n",{"type":20,"tag":45,"props":545,"children":546},{"class":47,"line":75},[547],{"type":20,"tag":45,"props":548,"children":549},{},[550],{"type":26,"value":551},"ml-experiments\u002Foutputs\u002Fesol_mlp_training_log.csv\n",{"type":20,"tag":45,"props":553,"children":554},{"class":47,"line":84},[555],{"type":20,"tag":45,"props":556,"children":557},{},[558],{"type":26,"value":559},"ml-experiments\u002Foutputs\u002Ffigures\u002Fesol_mlp_loss_curve.png\n",{"type":20,"tag":45,"props":561,"children":562},{"class":47,"line":93},[563],{"type":20,"tag":45,"props":564,"children":565},{},[566],{"type":26,"value":567},"ml-experiments\u002Freports\u002Fesol_model_compare.md\n",{"type":20,"tag":28,"props":569,"children":570},{},[571,577,579,585],{"type":20,"tag":41,"props":572,"children":574},{"className":573},[],[575],{"type":26,"value":576},"Dataset",{"type":26,"value":578}," 负责定义一条样本如何取出，",{"type":20,"tag":41,"props":580,"children":582},{"className":581},[],[583],{"type":26,"value":584},"DataLoader",{"type":26,"value":586}," 负责批量加载。训练时记录 train loss 和 validation loss，并加入 early stopping。validation loss 连续多轮不下降时停止训练，再恢复验证集表现最好的参数。",{"type":20,"tag":28,"props":588,"children":589},{},[590],{"type":26,"value":591},"模型 checkpoint 里保存了：",{"type":20,"tag":593,"props":594,"children":595},"ul",{},[596,606,611,616,621],{"type":20,"tag":597,"props":598,"children":599},"li",{},[600],{"type":20,"tag":41,"props":601,"children":603},{"className":602},[],[604],{"type":26,"value":605},"model_state_dict",{"type":20,"tag":597,"props":607,"children":608},{},[609],{"type":26,"value":610},"MLP 结构参数",{"type":20,"tag":597,"props":612,"children":613},{},[614],{"type":26,"value":615},"fingerprint 参数",{"type":20,"tag":597,"props":617,"children":618},{},[619],{"type":26,"value":620},"目标值标准化参数",{"type":20,"tag":597,"props":622,"children":623},{},[624],{"type":26,"value":625},"train \u002F validation \u002F test 指标",{"type":20,"tag":28,"props":627,"children":628},{},[629],{"type":26,"value":630},"这样后续做预测服务时，不需要重新猜模型结构和特征配置。",{"type":20,"tag":295,"props":632,"children":634},{"id":633},"对比结果",[635],{"type":26,"value":633},{"type":20,"tag":28,"props":637,"children":638},{},[639],{"type":26,"value":640},"这周最关键的文件不是单个模型结果，而是：",{"type":20,"tag":34,"props":642,"children":643},{"className":36,"code":567,"language":38,"meta":7,"style":7},[644],{"type":20,"tag":41,"props":645,"children":646},{"__ignoreMap":7},[647],{"type":20,"tag":45,"props":648,"children":649},{"class":47,"line":48},[650],{"type":20,"tag":45,"props":651,"children":652},{},[653],{"type":26,"value":567},{"type":20,"tag":28,"props":655,"children":656},{},[657],{"type":26,"value":658},"在同样的 random split 下，第 4 周和第 5 周的测试集结果是：",{"type":20,"tag":660,"props":661,"children":662},"table",{},[663,693],{"type":20,"tag":664,"props":665,"children":666},"thead",{},[667],{"type":20,"tag":668,"props":669,"children":670},"tr",{},[671,677,683,688],{"type":20,"tag":672,"props":673,"children":674},"th",{},[675],{"type":26,"value":676},"模型",{"type":20,"tag":672,"props":678,"children":680},{"align":679},"right",[681],{"type":26,"value":682},"MAE",{"type":20,"tag":672,"props":684,"children":685},{"align":679},[686],{"type":26,"value":687},"RMSE",{"type":20,"tag":672,"props":689,"children":690},{"align":679},[691],{"type":26,"value":692},"R2",{"type":20,"tag":694,"props":695,"children":696},"tbody",{},[697,721],{"type":20,"tag":668,"props":698,"children":699},{},[700,706,711,716],{"type":20,"tag":701,"props":702,"children":703},"td",{},[704],{"type":26,"value":705},"RDKit descriptors + RandomForest",{"type":20,"tag":701,"props":707,"children":708},{"align":679},[709],{"type":26,"value":710},"0.5415",{"type":20,"tag":701,"props":712,"children":713},{"align":679},[714],{"type":26,"value":715},"0.7690",{"type":20,"tag":701,"props":717,"children":718},{"align":679},[719],{"type":26,"value":720},"0.8611",{"type":20,"tag":668,"props":722,"children":723},{},[724,729,734,739],{"type":20,"tag":701,"props":725,"children":726},{},[727],{"type":26,"value":728},"Morgan Fingerprint + MLP",{"type":20,"tag":701,"props":730,"children":731},{"align":679},[732],{"type":26,"value":733},"0.9183",{"type":20,"tag":701,"props":735,"children":736},{"align":679},[737],{"type":26,"value":738},"1.1934",{"type":20,"tag":701,"props":740,"children":741},{"align":679},[742],{"type":26,"value":743},"0.6655",{"type":20,"tag":28,"props":745,"children":746},{},[747],{"type":26,"value":748},"这次 MLP 没有超过 RandomForest。",{"type":20,"tag":28,"props":750,"children":751},{},[752],{"type":26,"value":753},"这个结果并不意外。ESOL 数据集规模不大，RandomForest 对低维描述符的处理很稳，而 MLP 对训练细节更敏感。高维 fingerprint 加 MLP 如果没有足够数据和调参，很容易学不到比传统 baseline 更好的规律。",{"type":20,"tag":295,"props":755,"children":757},{"id":756},"这周真正留下来的判断",[758],{"type":26,"value":756},{"type":20,"tag":28,"props":760,"children":761},{},[762],{"type":26,"value":763},"第 5 周最大的收获不是“写了一个神经网络”，而是把深度学习模型放进了同一套评估框架里。",{"type":20,"tag":28,"props":765,"children":766},{},[767],{"type":26,"value":768},"如果没有第 4 周的 baseline，这周只看 MLP 自己的 loss 曲线，很容易误以为模型已经有效。但一对比指标，就能看到它并没有带来收益。",{"type":20,"tag":28,"props":770,"children":771},{},[772],{"type":26,"value":773},"这也改变了后续路线的判断顺序：",{"type":20,"tag":593,"props":775,"children":776},{},[777,782,787,792],{"type":20,"tag":597,"props":778,"children":779},{},[780],{"type":26,"value":781},"先保证数据处理正确",{"type":20,"tag":597,"props":783,"children":784},{},[785],{"type":26,"value":786},"先建立传统 ML baseline",{"type":20,"tag":597,"props":788,"children":789},{},[790],{"type":26,"value":791},"再比较 MLP 或 GNN 是否真的提升",{"type":20,"tag":597,"props":793,"children":794},{},[795],{"type":26,"value":796},"不用模型复杂度替代实验结论",{"type":20,"tag":28,"props":798,"children":799},{},[800],{"type":26,"value":801},"第 5 周结束后，项目里已经有了两类分子表征：人工描述符和 Morgan Fingerprint。下一步进入 Tox21，多标签毒性分类会比 ESOL 回归更接近 AI 制药里的 ADMET 语境。",{"type":20,"tag":803,"props":804,"children":805},"style",{},[806],{"type":26,"value":807},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":7,"searchDepth":57,"depth":57,"links":809},[810,811,812,813,814],{"id":297,"depth":57,"text":300},{"id":341,"depth":57,"text":344},{"id":485,"depth":57,"text":488},{"id":633,"depth":57,"text":633},{"id":756,"depth":57,"text":756},"markdown","content:articles:ai:ai-drug-week05-morgan-mlp.md","content","articles\u002Fai\u002Fai-drug-week05-morgan-mlp.md","articles\u002Fai\u002Fai-drug-week05-morgan-mlp","md",1780481290973]