[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"tool-mlwithme--BertWithPretrained":3,"similar-mlwithme--BertWithPretrained":112},{"id":4,"github_repo":5,"name":6,"description_en":7,"description_zh":8,"ai_summary_zh":9,"readme_en":10,"readme_zh":11,"quickstart_zh":12,"use_case_zh":13,"hero_image_url":14,"owner_login":15,"owner_name":16,"owner_avatar_url":17,"owner_bio":18,"owner_company":19,"owner_location":19,"owner_email":19,"owner_twitter":19,"owner_website":19,"owner_url":20,"languages":21,"stars":26,"forks":27,"last_commit_at":28,"license":19,"difficulty_score":29,"env_os":30,"env_gpu":30,"env_ram":30,"env_deps":31,"category_tags":43,"github_topics":46,"view_count":56,"oss_zip_url":19,"oss_zip_packed_at":19,"status":57,"created_at":58,"updated_at":59,"faqs":60,"releases":111},5454,"mlwithme\u002FBertWithPretrained","BertWithPretrained","An implementation of the BERT model and its related downstream tasks based on the PyTorch framework. @月来客栈","BertWithPretrained 是一个基于 PyTorch 框架实现的 BERT 模型开源项目，旨在帮助开发者从零开始理解并应用这一强大的自然语言处理技术。它不仅提供了完整的 BERT 模型代码实现，还涵盖了文本分类、语义蕴含、多项选择、问答系统以及命名实体识别等多种主流下游任务的具体应用示例。\n\n对于希望深入掌握 Transformer 架构原理的研究人员和深度学习开发者而言，BertWithPretrained 解决了“黑盒使用”的痛点。许多现有库仅允许调用预训练模型，而该项目通过从底层自注意力机制到上层任务逻辑的全流程代码复现，让用户能清晰洞察模型内部运作机制。此外，它还支持基于 NSP（下一句预测）和 MLM（掩码语言模型）任务从头训练 BERT，为定制化研究提供了坚实基础。\n\n该项目特别适合具备一定 Python 和 PyTorch 基础的 AI 工程师、算法研究员及高校学生。无论是想要复现经典论文实验，还是希望针对中文或英文场景进行二次开发，都能从中获得详尽的代码参考与理论指导。其结构清晰、注释丰富，并配套了今日头条分类、SQuAD 问答等真实数据集，是学习与实践 B","BertWithPretrained 是一个基于 PyTorch 框架实现的 BERT 模型开源项目，旨在帮助开发者从零开始理解并应用这一强大的自然语言处理技术。它不仅提供了完整的 BERT 模型代码实现，还涵盖了文本分类、语义蕴含、多项选择、问答系统以及命名实体识别等多种主流下游任务的具体应用示例。\n\n对于希望深入掌握 Transformer 架构原理的研究人员和深度学习开发者而言，BertWithPretrained 解决了“黑盒使用”的痛点。许多现有库仅允许调用预训练模型，而该项目通过从底层自注意力机制到上层任务逻辑的全流程代码复现，让用户能清晰洞察模型内部运作机制。此外，它还支持基于 NSP（下一句预测）和 MLM（掩码语言模型）任务从头训练 BERT，为定制化研究提供了坚实基础。\n\n该项目特别适合具备一定 Python 和 PyTorch 基础的 AI 工程师、算法研究员及高校学生。无论是想要复现经典论文实验，还是希望针对中文或英文场景进行二次开发，都能从中获得详尽的代码参考与理论指导。其结构清晰、注释丰富，并配套了今日头条分类、SQuAD 问答等真实数据集，是学习与实践 BERT 技术的理想入门资源。","# BertWithPretrained\n\n\\[[中文](README-zh-CN.md)|[English](README.md)\\]\n\nThis project is an implementation of the BERT model and its related downstream tasks based on the PyTorch framework. It also includes a detailed explanation of the BERT model and the principles of each underlying task.\n\n[BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https:\u002F\u002Farxiv.org\u002Fabs\u002F1810.04805)\n\nBefore learning to use this project, you need to know the relevant principles of Transformer by these three examples: [Translation](https:\u002F\u002Fgithub.com\u002Fmoon-hotel\u002FTransformerTranslation), [Classification](https:\u002F\u002Fgithub.com\u002Fmoon-hotel\u002FTransformerClassification), [Coupling Generation](https:\u002F\u002Fgithub.com\u002Fmoon-hotel\u002FTransformerCouplet).\n\n\n ## Implementations\n- [x] [1. Implementing the BERT model from scratch](model\u002FBasicBert)\n- [x] [2. Chinese text classification task based on BERT pretraining model](Tasks\u002FTaskForSingleSentenceClassification.py)\n- [x] [3. English text implication (MNLI) task based on BERT pretrained model](Tasks\u002FTaskForPairSentenceClassification.py)\n- [x] [4. English Multiple Choice (SWAG) task based on BERT pretrained model](Tasks\u002FTaskForMultipleChoice.py)\n- [x] [5. English Question Answering (SQuAD) Task Based on BERT pretrained Model ](Tasks\u002FTaskForSQuADQuestionAnswering.py)\n- [x] [6. Training BERT tasks from scratch based on NSL and MLM tasks](Tasks\u002FTaskForPretraining.py)\n- [x] [7. Named Entity Recognition task based on BERT pretraining model](Tasks\u002FTaskForChineseNER.py)\n\n## Project Structure\n- `bert_base_chinese`contains the [bert_base_chinese](https:\u002F\u002Fhuggingface.co\u002Fbert-base-chinese\u002Ftree\u002Fmain) pre-training model and configuration files\n\n- `bert_base_uncased_english`contains the [bert_base_uncased_english](https:\u002F\u002Fhuggingface.co\u002Fbert-base-uncased\u002Ftree\u002Fmain) pre-training model and configuration files\n- `data`contains all datasets used by each downstream task.\n    - `SingleSentenceClassification` is a 15-classes Chinese classification dataset of Toutiao.\n    - `PairSentenceClassification` is the dataset of MNLI (The Multi-Genre Natural Language Inference Corpus).\n    - `MultipeChoice` is the dataset of SWAG.\n    - `SQuAD` is the dataset of SQuAD-V1.1.\n    - `WikiText`is the Wikipedia English corpus for pre-training.\n    - `SongCi` is SongCi data for Chinese model pre-training\n    - `ChineseNER` is a dataset used to train Chinese Named Entity Recognition.\n- `model` is the implementation of each module\n    - `BasicBert` contains basic BERT implementation\n        - `MyTransformer.py` self-attention implementation.\n        - `BertEmbedding.py` Input Embedding implementation.\n        - `BertConfig.py` used to import configuration of `config.json`.\n        - `Bert.py` implementation of bert.\n    - `DownstreamTasks` contains all downstream tasks implementation\n        - `BertForSentenceClassification.py` sentence(s) classification implementation.\n        - `BertForMultipleChoice.py` multiple choice implementation.\n        - `BertForQuestionAnswering.py` question answer (text span) implementation.\n        - `BertForNSPAndMLM.py` NSP and MLM implementation.\n        - `BertForTokenClassification.py` token classification implementation.\n- `Task` implementation of training and inference for each downstream task\n    - `TaskForSingleSentenceClassification.py` taks of single sentence classification implementation such as sentence classification.\n    - `TaskForPairSentence.py`  task of pair sentence classification implementation such as MNLI.\n    - `TaskForMultipleChoice.py` task of multiple choice implementation such as SWAG.\n    - `TaskForSQuADQuestionAnswering.py` task os question answering (text span) implementation such as SQuAD.\n    - `TaskForPretraining.py` tasks of NSP ans MLM implementation.\n    - `TaskForChineseNER.py` task of Chinese Named Entity Recognition implementation.\n- `test` test cases of each downstream task.\n- `utils`\n    - `data_helpers.py` is the data preprocessing and dataset building module of each downstream task;\n    - `log_helper.py` is the log printing module.\n    - `creat_pretraining_data.py` used to construct the dataset of  BERT pre-training task.\n\n## Python Environment\nPython 3.6 and packages version\n```python\ntorch==1.5.0\ntorchtext==0.6.0\ntorchvision==0.6.0\ntransformers==4.5.1\nnumpy==1.19.5\npandas==1.1.5\nscikit-learn==0.24.0\ntqdm==4.61.0\n```\n## Usage\n### Step 1. Download Dataset \nDownloading each dataset and the corresponding BERT pretrained model (if empty) and putting it in the corresponding directory. For details, see the `README.md` file in each data (`data`) directory.\n### Step 2. Runing\nGoing to the `Tasks` directory and run the model.\n\n### 2.1 Chinese text classification task\n\nModel structure and data processing:\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_928c3c39e396.jpg\" width=\"45%\">\n\n```python\npython TaskForSingleSentenceClassification.py\n```\n\nResult: \n\n```python\n-- INFO: Epoch: 0, Batch[0\u002F4186], Train loss :2.862, Train acc: 0.125\n-- INFO: Epoch: 0, Batch[10\u002F4186], Train loss :2.084, Train acc: 0.562\n-- INFO: Epoch: 0, Batch[20\u002F4186], Train loss :1.136, Train acc: 0.812        \n-- INFO: Epoch: 0, Batch[30\u002F4186], Train loss :1.000, Train acc: 0.734\n...\n-- INFO: Epoch: 0, Batch[4180\u002F4186], Train loss :0.418, Train acc: 0.875\n-- INFO: Epoch: 0, Train loss: 0.481, Epoch time = 1123.244s\n...\n-- INFO: Epoch: 9, Batch[4180\u002F4186], Train loss :0.102, Train acc: 0.984\n-- INFO: Epoch: 9, Train loss: 0.100, Epoch time = 1130.071s\n-- INFO: Accurcay on val 0.884\n-- INFO: Accurcay on val 0.888\n```\n\n### 2.2 Text Implication\n\nModel structure and data processing:\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_159f09d61ce3.jpg\" width=\"45%\">\n\n```python\npython TaskForPairSentenceClassification.py\n```\n\nResult:\n\n```python\n-- INFO: Epoch: 0, Batch[0\u002F17181], Train loss :1.082, Train acc: 0.438\n-- INFO: Epoch: 0, Batch[10\u002F17181], Train loss :1.104, Train acc: 0.438\n-- INFO: Epoch: 0, Batch[20\u002F17181], Train loss :1.129, Train acc: 0.250     \n-- INFO: Epoch: 0, Batch[30\u002F17181], Train loss :1.063, Train acc: 0.375\n...\n-- INFO: Epoch: 0, Batch[17180\u002F17181], Train loss :0.367, Train acc: 0.909\n-- INFO: Epoch: 0, Train loss: 0.589, Epoch time = 2610.604s\n...\n-- INFO: Epoch: 9, Batch[0\u002F17181], Train loss :0.064, Train acc: 1.000\n-- INFO: Epoch: 9, Train loss: 0.142, Epoch time = 2542.781s\n-- INFO: Accurcay on val 0.827\n-- INFO: Accurcay on val 0.830\n```\n\n### 2.3 Multiple Choice (SWAG) Task\n\nModel structure and data processing:\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_239b92e5ccb4.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_9bbb5bb7ddcf.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_5993fa75c963.jpg\" width=\"50%\">\n\n```python\npython TaskForMultipleChoice.py\n```\n\nResult:\n```python\n[2021-11-11 21:32:50] - INFO: Epoch: 0, Batch[0\u002F4597], Train loss :1.433, Train acc: 0.250\n[2021-11-11 21:32:58] - INFO: Epoch: 0, Batch[10\u002F4597], Train loss :1.277, Train acc: 0.438\n[2021-11-11 21:33:01] - INFO: Epoch: 0, Batch[20\u002F4597], Train loss :1.249, Train acc: 0.438\n        ......\n[2021-11-11 21:58:34] - INFO: Epoch: 0, Batch[4590\u002F4597], Train loss :0.489, Train acc: 0.875\n[2021-11-11 21:58:36] - INFO: Epoch: 0, Batch loss :0.786, Epoch time = 1546.173s\n[2021-11-11 21:28:55] - INFO: Epoch: 0, Batch[0\u002F4597], Train loss :1.433, Train acc: 0.250\n[2021-11-11 21:30:52] - INFO: He is throwing darts at a wall. A woman, squats alongside flies side to side with his gun.  ## False\n[2021-11-11 21:30:52] - INFO: He is throwing darts at a wall. A woman, throws a dart at a dartboard.   ## False\n[2021-11-11 21:30:52] - INFO: He is throwing darts at a wall. A woman, collapses and falls to the floor.   ## False\n[2021-11-11 21:30:52] - INFO: He is throwing darts at a wall. A woman, is standing next to him.    ## True\n[2021-11-11 21:30:52] - INFO: Accuracy on val 0.794\n```\n\n### 2.4 Question Answering (SQuAD) Task\n\nModel structure and data processing:\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_a943974241a7.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_574083cb5c04.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_b66bb39f8b97.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_6571679b512c.jpg\" width=\"50%\">\n\n```python\npython TaskForSQuADQuestionAnswering.py\n```\nResult:\n```python\n[2022-01-02 14:42:17]缓存文件 ~\u002FBertWithPretrained\u002Fdata\u002FSQuAD\u002Fdev-v1_128_384_64.pt 不存在，重新处理并缓存！\n[2022-01-02 14:42:17] - DEBUG: \u003C\u003C\u003C\u003C\u003C\u003C\u003C\u003C  进入新的example  >>>>>>>>>\n[2022-01-02 14:42:17] - DEBUG: ## 正在预处理数据 utils.data_helpers is_training = False\n[2022-01-02 14:42:17] - DEBUG: ## 问题 id: 56be5333acb8001400a5030d\n[2022-01-02 14:42:17] - DEBUG: ## 原始问题 text: Which performers joined the headliner during the Super Bowl 50 halftime show?\n[2022-01-02 14:42:17] - DEBUG: ## 原始描述 text: CBS broadcast Super Bowl 50 in the U.S., and charged an average of $5 million for a  ....\n[2022-01-02 14:42:17]- DEBUG: ## 上下文长度为：87, 剩余长度 rest_len 为 ： 367\n[2022-01-02 14:42:17] - DEBUG: ## input_tokens: ['[CLS]', 'which', 'performers', 'joined', 'the', 'headline', '##r', 'during', 'the', ...]\n[2022-01-02 14:42:17] - DEBUG: ## input_ids:[101, 2029, 9567, 2587, 1996, 17653, 2099, 2076, 1996, 3565, 4605, 2753, 22589, 2265, 1029, 102, 6568, ....]\n[2022-01-02 14:42:17] - DEBUG: ## segment ids:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...]\n[2022-01-02 14:42:17] - DEBUG: ## orig_map:{16: 0, 17: 1, 18: 2, 19: 3, 20: 4, 21: 5, 22: 6, 23: 7, 24: 7, 25: 7, 26: 7, 27: 7, 28: 8, 29: 9, 30: 10,....}\n[2022-01-02 14:42:17] - DEBUG: ======================\n....\n[2022-01-02 15:13:50] - INFO: Epoch:0, Batch[810\u002F7387] Train loss: 0.998, Train acc: 0.708\n[2022-01-02 15:13:55] - INFO: Epoch:0, Batch[820\u002F7387] Train loss: 1.130, Train acc: 0.708\n[2022-01-02 15:13:59] - INFO: Epoch:0, Batch[830\u002F7387] Train loss: 1.960, Train acc: 0.375\n[2022-01-02 15:14:04] - INFO: Epoch:0, Batch[840\u002F7387] Train loss: 1.933, Train acc: 0.542\n......\n[2022-01-02 15:15:27] - INFO:  ### Quesiotn: [CLS] when was the first university in switzerland founded..\n[2022-01-02 15:15:27] - INFO:    ## Predicted answer: 1460\n[2022-01-02 15:15:27] - INFO:    ## True answer: 1460\n[2022-01-02 15:15:27] - INFO:    ## True answer idx: (tensor(46, tensor(47))\n[2022-01-02 15:15:27] - INFO:  ### Quesiotn: [CLS] how many wards in plymouth elect two councillors?\n[2022-01-02 15:15:27] - INFO:    ## Predicted answer: 17 of which elect three .....\n[2022-01-02 15:15:27] - INFO:    ## True answer: three\n[2022-01-02 15:15:27] - INFO:    ## True answer idx: (tensor(25, tensor(25))\n```\n运行结束后，`data\u002FSQuAD`目录中会生成一个名为`best_result.json`的预测文件，此时只需要切换到该目录下，并运行以下代码即可得到在`dev-v1.1.json`的测试结果：\n```python\npython evaluate-v1.1.py dev-v1.1.json best_result.json\n\n\"exact_match\" : 80.879848628193, \"f1\": 88.338575234135\n```\n\n### 2.5 NSL and MLM tasks\n\nModel structure and data processing:\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_4b7aba86d808.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_800bbf029e40.jpg\" width=\"50%\">\n\n```python\nif __name__ == '__main__':\n    config = ModelConfig()\n    train(config)\n    sentences_1 = [\"I no longer love her, true, but perhaps I love her.\",\n                   \"Love is so short and oblivion so long.\"]\n\n    sentences_2 = [\"我住长江头，君住长江尾。\",\n                   \"日日思君不见君，共饮长江水。\",\n                   \"此水几时休，此恨何时已。\",\n                   \"只愿君心似我心，定不负相思意。\"]\n    inference(config, sentences_2, masked=False, language='zh')\n```\n\nResult:\n```python\n- INFO: ## 成功载入已有模型进行推理……\n- INFO:  ### 原始：我住长江头，君住长江尾。\n- INFO:   ## 掩盖：我住长江头，[MASK]住长[MASK]尾。\n- INFO:   ## 预测：我住长江头，君住长河尾。  \n- INFO: ====================\n- INFO:  ### 原始：日日思君不见君，共饮长江水。\n- INFO:   ## 掩盖：日日思君不[MASK]君，共[MASK]长江水。\n- INFO:   ## 预测：日日思君不见君，共饮长江水。\n#   ......\n```\n\n### 2.6 Named Entity Recognition task\n\nModel structure and data processing:\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_61827e9ebf7b.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_9b27c29863f0.jpg\" width=\"50%\">\n\n```python\nif __name__ == '__main__':\n    config = ModelConfig()\n    train(config)\n    sentences = ['智光拿出石壁拓文为乔峰详述事情始末，乔峰方知自己原本姓萧，乃契丹后族。',\n                 '当乔峰问及带头大哥时，却发现智光大师已圆寂。',\n                 '乔峰、阿朱相约找最后知情人康敏问完此事后，就到塞外骑马牧羊，再不回来。']\n    inference(config, sentences)\n```\n\nResult of training:\n\n```python\n- INFO: Epoch: [1\u002F10], Batch[620\u002F1739], Train Loss: 0.115, Train acc: 0.96386\n- INFO: Epoch: [1\u002F10], Batch[240\u002F1739], Train Loss: 0.098, Train acc: 0.96466\n- INFO: Epoch: [1\u002F10], Batch[660\u002F1739], Train Loss: 0.087, Train acc: 0.96435\n......\n- INFO:句子：在澳大利亚等西方国家改变反倾销政策中对中国的划分后，不少欧盟人士也认识到，此种划分已背离中国经济迅速发展的现实。\n- INFO: 澳大利亚：\tLOC\n- INFO: 中国：\tLOC\n- INFO: 欧盟：\tLOC\n- INFO: 中国： LOC\n......\n              precision    recall  f1-score   support\n\n           O       1.00      0.99      1.00     97640\n       B-ORG       0.86      0.93      0.89       984\n       B-LOC       0.94      0.93      0.94      1934\n       B-PER       0.97      0.97      0.97       884\n       I-ORG       0.90      0.96      0.93      3945\n       I-LOC       0.91      0.95      0.93      2556\n       I-PER       0.99      0.98      0.98      1714\n\n    accuracy                           0.99    109657\n   macro avg       0.94      0.96      0.95    109657\nweighted avg       0.99      0.99      0.99    109657\n```\n\nResult of inference:\n```python\n- INFO: 句子：智光拿出石壁拓文为乔峰详述事情始末，乔峰方知自己原本姓萧，乃契丹后族。\n- INFO: \t智光：\tPER\n- INFO: \t乔峰：\tPER\n- INFO: \t乔峰：\tPER\n- INFO: \t萧：\tPER\n- INFO: \t丹：\tPER\n......\n```\n\n","# BertWithPretrained\n\n\\[[中文](README-zh-CN.md)|[English](README.md)\\]\n\n本项目基于 PyTorch 框架实现了 BERT 模型及其相关的下游任务。同时，项目还包含了对 BERT 模型以及各个底层任务原理的详细讲解。\n\n[BERT: 用于语言理解的深度双向 Transformer 预训练](https:\u002F\u002Farxiv.org\u002Fabs\u002F1810.04805)\n\n在开始使用本项目之前，您需要先通过以下三个示例了解 Transformer 的相关原理：[翻译](https:\u002F\u002Fgithub.com\u002Fmoon-hotel\u002FTransformerTranslation)、[分类](https:\u002F\u002Fgithub.com\u002Fmoon-hotel\u002FTransformerClassification) 和 [对联生成](https:\u002F\u002Fgithub.com\u002Fmoon-hotel\u002FTransformerCouplet)。\n\n\n ## 实现内容\n- [x] [1. 从零开始实现 BERT 模型](model\u002FBasicBert)\n- [x] [2. 基于 BERT 预训练模型的中文文本分类任务](Tasks\u002FTaskForSingleSentenceClassification.py)\n- [x] [3. 基于 BERT 预训练模型的英文文本蕴含（MNLI）任务](Tasks\u002FTaskForPairSentenceClassification.py)\n- [x] [4. 基于 BERT 预训练模型的英文多项选择（SWAG）任务](Tasks\u002FTaskForMultipleChoice.py)\n- [x] [5. 基于 BERT 预训练模型的英文问答（SQuAD）任务](Tasks\u002FTaskForSQuADQuestionAnswering.py)\n- [x] [6. 基于 NSL 和 MLM 任务从零开始训练 BERT 任务](Tasks\u002FTaskForPretraining.py)\n- [x] [7. 基于 BERT 预训练模型的命名实体识别任务](Tasks\u002FTaskForChineseNER.py)\n\n## 项目结构\n- `bert_base_chinese` 包含 [bert_base_chinese](https:\u002F\u002Fhuggingface.co\u002Fbert-base-chinese\u002Ftree\u002Fmain) 预训练模型及配置文件\n- `bert_base_uncased_english` 包含 [bert_base_uncased_english](https:\u002F\u002Fhuggingface.co\u002Fbert-base-uncased\u002Ftree\u002Fmain) 预训练模型及配置文件\n- `data` 包含所有下游任务使用的数据集。\n    - `SingleSentenceClassification` 是来自今日头条的 15 类中文分类数据集。\n    - `PairSentenceClassification` 是 MNLI（多类型自然语言推理语料库）的数据集。\n    - `MultipeChoice` 是 SWAG 的数据集。\n    - `SQuAD` 是 SQuAD-V1.1 的数据集。\n    - `WikiText` 是用于预训练的维基百科英文语料库。\n    - `SongCi` 是用于中文模型预训练的宋词数据。\n    - `ChineseNER` 是用于训练中文命名实体识别的数据集。\n- `model` 是各个模块的实现\n    - `BasicBert` 包含基础的 BERT 实现\n        - `MyTransformer.py` 自注意力机制的实现。\n        - `BertEmbedding.py` 输入嵌入的实现。\n        - `BertConfig.py` 用于导入 `config.json` 配置文件。\n        - `Bert.py` BERT 模型的实现。\n    - `DownstreamTasks` 包含所有下游任务的实现\n        - `BertForSentenceClassification.py` 句子分类的实现。\n        - `BertForMultipleChoice.py` 多项选择的实现。\n        - `BertForQuestionAnswering.py` 问题回答（文本片段）的实现。\n        - `BertForNSPAndMLM.py` NSP 和 MLM 的实现。\n        - `BertForTokenClassification.py` 标记分类的实现。\n- `Task` 是每个下游任务的训练和推理实现\n    - `TaskForSingleSentenceClassification.py` 单句分类任务的实现，例如句子分类。\n    - `TaskForPairSentence.py` 双句分类任务的实现，例如 MNLI。\n    - `TaskForMultipleChoice.py` 多项选择任务的实现，例如 SWAG。\n    - `TaskForSQuADQuestionAnswering.py` 问题回答（文本片段）任务的实现，例如 SQuAD。\n    - `TaskForPretraining.py` NSP 和 MLM 任务的实现。\n    - `TaskForChineseNER.py` 中文命名实体识别任务的实现。\n- `test` 是每个下游任务的测试用例。\n- `utils`\n    - `data_helpers.py` 是每个下游任务的数据预处理和数据集构建模块；\n    - `log_helper.py` 是日志打印模块。\n    - `creat_pretraining_data.py` 用于构建 BERT 预训练任务的数据集。\n\n## Python 环境\nPython 3.6 及以下包版本：\n```python\ntorch==1.5.0\ntorchtext==0.6.0\ntorchvision==0.6.0\ntransformers==4.5.1\nnumpy==1.19.5\npandas==1.1.5\nscikit-learn==0.24.0\ntqdm==4.61.0\n```\n\n## 使用方法\n### 第一步：下载数据集\n下载各个数据集以及相应的 BERT 预训练模型（如果尚未下载），并将其放置在对应的目录中。具体操作请参阅每个数据（`data`）目录下的 `README.md` 文件。\n### 第二步：运行\n进入 `Tasks` 目录并运行相应模型。\n\n### 2.1 中文文本分类任务\n\n模型结构与数据处理：\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_928c3c39e396.jpg\" width=\"45%\">\n\n```python\npython TaskForSingleSentenceClassification.py\n```\n\n结果：\n\n```python\n-- INFO: Epoch: 0, Batch[0\u002F4186], 训练损失 :2.862, 训练准确率: 0.125\n-- INFO: Epoch: 0, Batch[10\u002F4186], 训练损失 :2.084, 训练准确率: 0.562\n-- INFO: Epoch: 0, Batch[20\u002F4186], 训练损失 :1.136, 训练准确率: 0.812        \n-- INFO: Epoch: 0, Batch[30\u002F4186], 训练损失 :1.000, 训练准确率: 0.734\n...\n-- INFO: Epoch: 0, Batch[4180\u002F4186], 训练损失 :0.418, 训练准确率: 0.875\n-- INFO: Epoch: 0, 训练损失: 0.481, 训练时长 = 1123.244秒\n...\n-- INFO: Epoch: 9, Batch[4180\u002F4186], 训练损失 :0.102, 训练准确率: 0.984\n-- INFO: Epoch: 9, 训练损失: 0.100, 训练时长 = 1130.071秒\n-- INFO: 验证集准确率 0.884\n-- INFO: 验证集准确率 0.888\n```\n\n### 2.2 文本蕴含任务\n\n模型结构与数据处理：\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_159f09d61ce3.jpg\" width=\"45%\">\n\n```python\npython TaskForPairSentenceClassification.py\n```\n\n结果：\n\n```python\n-- INFO: Epoch: 0, Batch[0\u002F17181], 训练损失 :1.082, 训练准确率: 0.438\n-- INFO: Epoch: 0, Batch[10\u002F17181], 训练损失 :1.104, 训练准确率: 0.438\n-- INFO: Epoch: 0, Batch[20\u002F17181], 训练损失 :1.129, 训练准确率: 0.250     \n-- INFO: Epoch: 0, Batch[30\u002F17181], 训练损失 :1.063, 训练准确率: 0.375\n...\n-- INFO: Epoch: 0, Batch[17180\u002F17181], 训练损失 :0.367, 训练准确率: 0.909\n-- INFO: Epoch: 0, 训练损失: 0.589, 训练时长 = 2610.604秒\n...\n-- INFO: Epoch: 9, Batch[0\u002F17181], 训练损失 :0.064, 训练准确率: 1.000\n-- INFO: Epoch: 9, 训练损失: 0.142, 训练时长 = 2542.781秒\n-- INFO: 验证集准确率 0.827\n-- INFO: 验证集准确率 0.830\n```\n\n### 2.3 多选题（SWAG）任务\n\n模型结构与数据处理：\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_239b92e5ccb4.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_9bbb5bb7ddcf.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_5993fa75c963.jpg\" width=\"50%\">\n\n```python\npython TaskForMultipleChoice.py\n```\n\n结果：\n```python\n[2021-11-11 21:32:50] - INFO: 第0轮, 第[0\u002F4597]批, 训练损失：1.433, 训练准确率：0.250\n[2021-11-11 21:32:58] - INFO: 第0轮, 第[10\u002F4597]批, 训练损失：1.277, 训练准确率：0.438\n[2021-11-11 21:33:01] - INFO: 第0轮, 第[20\u002F4597]批, 训练损失：1.249, 训练准确率：0.438\n        ......\n[2021-11-11 21:58:34] - INFO: 第0轮, 第[4590\u002F4597]批, 训练损失：0.489, 训练准确率：0.875\n[2021-11-11 21:58:36] - INFO: 第0轮, 批次平均损失：0.786, 轮次耗时 = 1546.173秒\n[2021-11-11 21:28:55] - INFO: 第0轮, 第[0\u002F4597]批, 训练损失：1.433, 训练准确率：0.250\n[2021-11-11 21:30:52] - INFO: 他在向墙上投掷飞镖。一位女士蹲在他身旁，手持枪左右移动。  ## 错误\n[2021-11-11 21:30:52] - INFO: 他在向墙上投掷飞镖。一位女士正在向飞镖靶投掷飞镖。   ## 错误\n[2021-11-11 21:30:52] - INFO: 他在向墙上投掷飞镖。一位女士突然倒下，跌落在地板上。   ## 错误\n[2021-11-11 21:30:52] - INFO: 他在向墙上投掷飞镖。一位女士正站在他旁边。    ## 正确\n[2021-11-11 21:30:52] - INFO: 验证集准确率 0.794\n```\n\n### 2.4 问答（SQuAD）任务\n\n模型结构与数据处理：\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_a943974241a7.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_574083cb5c04.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_b66bb39f8b97.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_6571679b512c.jpg\" width=\"50%\">\n\n```python\npython TaskForSQuADQuestionAnswering.py\n```\n结果：\n```python\n[2022-01-02 14:42:17] 缓存文件 ~\u002FBertWithPretrained\u002Fdata\u002FSQuAD\u002Fdev-v1_128_384_64.pt 不存在，重新处理并缓存！\n[2022-01-02 14:42:17] - DEBUG: \u003C\u003C\u003C\u003C\u003C\u003C\u003C\u003C  进入新的example  >>>>>>>>>\n[2022-01-02 14:42:17] - DEBUG: ## 正在预处理数据 utils.data_helpers is_training = False\n[2022-01-02 14:42:17] - DEBUG: ## 问题 id: 56be5333acb8001400a5030d\n[2022-01-02 14:42:17] - DEBUG: ## 原始问题 text: Which performers joined the headliner during the Super Bowl 50 halftime show?\n[2022-01-02 14:42:17] - DEBUG: ## 原始描述 text: CBS broadcast Super Bowl 50 in the U.S., and charged an average of $5 million for a  ....\n[2022-01-02 14:42:17]- DEBUG: ## 上下文长度为：87, 剩余长度 rest_len 为 ： 367\n[2022-01-02 14:42:17] - DEBUG: ## input_tokens: ['[CLS]', 'which', 'performers', 'joined', 'the', 'headline', '##r', 'during', 'the', ...]\n[2022-01-02 14:42:17] - DEBUG: ## input_ids:[101, 2029, 9567, 2587, 1996, 17653, 2099, 2076, 1996, 3565, 4605, 2753, 22589, 2265, 1029, 102, 6568, ....]\n[2022-01-02 14:42:17] - DEBUG: ## segment ids:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, ...]\n[2022-01-02 14:42:17] - DEBUG: ## orig_map:{16: 0, 17: 1, 18: 2, 19: 3, 20: 4, 21: 5, 22: 6, 23: 7, 24: 7, 25: 7, 26: 7, 27: 7, 28: 8, 29: 9, 30: 10,....}\n[2022-01-02 14:42:17] - DEBUG: ======================\n....\n[2022-01-02 15:13:50] - INFO: 第0轮, 第[810\u002F7387]批, 训练损失：0.998, 训练准确率：0.708\n[2022-01-02 15:13:55] - INFO: 第0轮, 第[820\u002F7387]批, 训练损失：1.130, 训练准确率：0.708\n[2022-01-02 15:13:59] - INFO: 第0轮, 第[830\u002F7387]批, 训练损失：1.960, 训练准确率：0.375\n[2022-01-02 15:14:04] - INFO: 第0轮, 第[840\u002F7387]批, 训练损失：1.933, 训练准确率：0.542\n......\n[2022-01-02 15:15:27] - INFO:  ### 问题：[CLS] 瑞士的第一所大学是什么时候成立的？\n[2022-01-02 15:15:27] - INFO:    ## 预测答案：1460年\n[2022-01-02 15:15:27] - INFO:    ## 正确答案：1460年\n[2022-01-02 15:15:27] - INFO:    ## 正确答案索引：(tensor(46, tensor(47))\n[2022-01-02 15:15:27] - INFO:  ### 问题：普利茅斯有多少个区选举两名议员？\n[2022-01-02 15:15:27] - INFO:    ## 预测答案：17个区中，有3个区选举三名……\n[2022-01-02 15:15:27] - INFO:    ## 正确答案：3名\n[2022-01-02 15:15:27] - INFO:    ## 正确答案索引：(tensor(25, tensor(25))\n```\n运行结束后，`data\u002FSQuAD`目录中会生成一个名为`best_result.json`的预测文件，此时只需要切换到该目录下，并运行以下代码即可得到在`dev-v1.1.json`的测试结果：\n```python\npython evaluate-v1.1.py dev-v1.1.json best_result.json\n\n\"exact_match\" : 80.879848628193, \"f1\": 88.338575234135\n```\n\n### 2.5 NSL和MLM任务\n\n模型结构与数据处理：\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_4b7aba86d808.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_800bbf029e40.jpg\" width=\"50%\">\n\n```python\nif __name__ == '__main__':\n    config = ModelConfig()\n    train(config)\n    sentences_1 = [\"I no longer love her, true, but perhaps I love her.\",\n                   \"Love is so short and oblivion so long.\"]\n\n    sentences_2 = [\"我住长江头，君住长江尾。\",\n                   \"日日思君不见君，共饮长江水。\",\n                   \"此水几时休，此恨何时已。\",\n                   \"只愿君心似我心，定不负相思意。\"]\n    inference(config, sentences_2, masked=False, language='zh')\n```\n\n结果：\n```python\n- INFO: ## 成功载入已有模型进行推理……\n- INFO:  ### 原始：我住长江头，君住长江尾。\n- INFO:   ## 掩盖：我住长江头，[MASK]住长[MASK]尾。\n- INFO:   ## 预测：我住长江头，君住长河尾。  \n- INFO: ====================\n- INFO:  ### 原始：日日思君不见君，共饮长江水。\n- INFO:   ## 掩盖：日日思君不[MASK]君，共[MASK]长江水。\n- INFO:   ## 预测：日日思君不见君，共饮长江水。\n#   ......\n```\n\n### 2.6 命名实体识别任务\n\n模型结构与数据处理：\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_61827e9ebf7b.jpg\" width=\"50%\">\n\n\u003Cimg src=\"https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_readme_9b27c29863f0.jpg\" width=\"50%\">\n\n```python\nif __name__ == '__main__':\n    config = ModelConfig()\n    train(config)\n    sentences = ['智光拿出石壁拓文为乔峰详述事情始末，乔峰方知自己原本姓萧，乃契丹后族。',\n                 '当乔峰问及带头大哥时，却发现智光大师已圆寂。',\n                 '乔峰、阿朱相约找最后知情人康敏问完此事后，就到塞外骑马牧羊，再不回来。']\n    inference(config, sentences)\n```\n\n训练结果：\n\n```python\n- INFO: 第[1\u002F10]轮, 第[620\u002F1739]批, 训练损失：0.115, 训练准确率：0.96386\n- INFO: 第[1\u002F10]轮, 第[240\u002F1739]批, 训练损失：0.098, 训练准确率：0.96466\n- INFO: 第[1\u002F10]轮, 第[660\u002F1739]批, 训练损失：0.087, 训练准确率：0.96435\n......\n- INFO: 句子：在澳大利亚等西方国家改变反倾销政策中对中国的划分后，不少欧盟人士也认识到，此种划分已背离中国经济迅速发展的现实。\n- INFO: 澳大利亚：\tLOC\n- INFO: 中国：\tLOC\n- INFO: 欧盟：\tLOC\n- INFO: 中国： LOC\n......\n              precision    recall  f1-score   support\n\n           O       1.00      0.99      1.00     97640\n       B-ORG       0.86      0.93      0.89       984\n       B-LOC       0.94      0.93      0.94      1934\n       B-PER       0.97      0.97      0.97       884\n       I-ORG       0.90      0.96      0.93      3945\n       I-LOC       0.91      0.95      0.93      2556\n       I-PER       0.99      0.98      0.98      1714\n\n    accuracy                           0.99    109657\n   macro avg       0.94      0.96      0.95    109657\nweighted avg       0.99      0.99      0.99    109657\n```\n\n推理结果：\n```python\n- INFO: 句子：智光拿出石壁拓文为乔峰详述事情始末，乔峰方知自己原本姓萧，乃契丹后族。\n- INFO: \t智光：\tPER\n- INFO: \t乔峰：\tPER\n- INFO: \t乔峰：\tPER\n- INFO: \t萧：\tPER\n- INFO: \t丹：\tPER\n......\n```","# BertWithPretrained 快速上手指南\n\nBertWithPretrained 是一个基于 PyTorch 框架实现的 BERT 模型及其下游任务开源项目。本项目不仅提供了从 scratch 实现 BERT 的代码，还涵盖了中文文本分类、英文蕴含判断、多项选择、问答系统、预训练任务（NSP\u002FMLM）及命名实体识别等多种任务的完整实现与原理讲解。\n\n## 1. 环境准备\n\n在开始之前，请确保您的开发环境满足以下要求：\n\n*   **操作系统**: Linux \u002F macOS \u002F Windows\n*   **Python 版本**: Python 3.6+\n*   **核心依赖**:\n    *   `torch==1.5.0`\n    *   `transformers==4.5.1`\n    *   `numpy`, `pandas`, `scikit-learn`, `tqdm` 等数据处理库\n\n### 安装依赖\n\n建议使用国内镜像源（如清华源）加速安装过程：\n\n```bash\npip install torch==1.5.0 torchvision==0.6.0 torchtext==0.6.0 -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\npip install transformers==4.5.1 numpy==1.19.5 pandas==1.1.5 scikit-learn==0.24.0 tqdm==4.61.0 -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple\n```\n\n## 2. 安装与数据准备\n\n本项目无需复杂的安装命令，克隆代码库后需手动下载数据集和预训练模型。\n\n### 步骤 1: 获取代码\n```bash\ngit clone \u003C项目仓库地址>\ncd BertWithPretrained\n```\n\n### 步骤 2: 下载数据集与预训练模型\n项目依赖特定的目录结构存放数据和模型。请访问各数据子目录下的说明文件或直接访问 Hugging Face 下载以下内容并放入对应文件夹：\n\n*   **预训练模型**:\n    *   `bert_base_chinese`: 放入 `bert_base_chinese` 目录 (对应中文任务)\n    *   `bert_base_uncased_english`: 放入 `bert_base_uncased_english` 目录 (对应英文任务)\n*   **数据集** (放入 `data` 目录对应的子文件夹):\n    *   `SingleSentenceClassification`: 头条新闻中文分类数据集\n    *   `PairSentenceClassification`: MNLI (英文蕴含)\n    *   `MultipeChoice`: SWAG (英文多选)\n    *   `SQuAD`: SQuAD-V1.1 (英文问答)\n    *   `WikiText` \u002F `SongCi`: 用于预训练任务的语料\n    *   `ChineseNER`: 中文命名实体识别数据集\n\n> **提示**: 具体下载链接和详细放置规则请参考项目根目录及各 `data` 子目录下的 `README.md` 文件。\n\n## 3. 基本使用\n\n所有任务脚本均位于 `Tasks` 目录下。进入该目录即可运行相应的训练与推理脚本。\n\n### 示例 1: 中文文本分类\n运行单句分类任务（基于头条新闻数据集）：\n\n```bash\ncd Tasks\npython TaskForSingleSentenceClassification.py\n```\n*输出将显示每个 Epoch 的 Loss、准确率以及验证集结果。*\n\n### 示例 2: 英文问答任务 (SQuAD)\n运行问答任务并进行评估：\n\n```bash\ncd Tasks\npython TaskForSQuADQuestionAnswering.py\n```\n训练结束后，会在 `data\u002FSQuAD` 生成 `best_result.json`。运行以下命令查看最终评测指标：\n\n```bash\ncd data\u002FSQuAD\npython evaluate-v1.1.py dev-v1.1.json best_result.json\n```\n\n### 示例 3: 中文命名实体识别 (NER)\n编辑 `TaskForChineseNER.py` 中的测试句子，然后运行：\n\n```bash\ncd Tasks\npython TaskForChineseNER.py\n```\n*代码内部包含 `train` 和 `inference` 逻辑，可直接观察对自定义中文句子的实体抽取效果。*\n\n### 示例 4: BERT 预训练任务 (MLM\u002FNSP)\n运行掩码语言模型（MLM）和下一句预测（NSP）任务：\n\n```bash\ncd Tasks\npython TaskForPretraining.py\n```\n*该脚本演示了如何从头构建预训练数据并进行训练，支持中英文语料。*\n\n---\n**注意**: 首次运行时，程序会自动处理数据并生成缓存文件（如 `.pt` 文件），请耐心等待预处理完成。","某金融科技公司的算法团队正急需构建一个能自动识别新闻中“公司实体”并判断其“情感倾向”的风控监控系统。\n\n### 没有 BertWithPretrained 时\n- **重复造轮子耗时久**：团队需从零手写 Transformer 的自注意力机制和嵌入层，花费数周调试底层代码而非关注业务逻辑。\n- **任务适配门槛高**：面对命名实体识别（NER）和文本分类两种不同任务，缺乏统一的微调框架，需分别摸索数据预处理和模型接口。\n- **预训练资源难整合**：难以直接加载标准的中文 BERT 预训练权重，导致模型冷启动效果差，且无法复现论文中的 NSP 和 MLM 预训练过程。\n- **教学与实战脱节**：新入职员工缺乏对 BERT 原理的直观代码参考，只能阅读晦涩论文，上手周期长达一个月。\n\n### 使用 BertWithPretrained 后\n- **开箱即用提效率**：直接调用 `BasicBert` 模块即可复用完整的 BERT 架构，将原本数周的基础搭建工作缩短至几天。\n- **多任务统一框架**：利用内置的 `TaskForChineseNER` 和 `TaskForSingleSentenceClassification` 脚本，快速适配实体抽取和情感分析任务，代码结构清晰统一。\n- **无缝衔接预训练模型**：一键加载 `bert_base_chinese` 权重，并支持基于 WikiText 或宋词数据进行自定义 NSP\u002FMLM 预训练，显著提升模型在金融语料上的表现。\n- **代码即教材**：新员工通过阅读其详细的模块化实现（如 `MyTransformer.py`），迅速理解双向 Transformer 原理，培训周期缩短至一周。\n\nBertWithPretrained 通过将复杂的 BERT 理论转化为模块化、可执行的 PyTorch 代码，让开发者能从繁琐的底层实现中解放出来，专注于下游业务价值的挖掘。","https:\u002F\u002Foss.gittoolsai.com\u002Fimages\u002Fmlwithme_BertWithPretrained_4694da3b.png","mlwithme","跟我学机器学习","https:\u002F\u002Foss.gittoolsai.com\u002Favatars\u002Fmlwithme_db0de5f3.png","专注机器学习、深度学习技术原理分享，写作8年著有《跟我一起学机器学习》、《跟我一起学深度学习》、《This Post Is All You Need》（全网阅读300万+）等作品。感兴趣可添加掌柜微信：nulls8 ",null,"https:\u002F\u002Fgithub.com\u002Fmlwithme",[22],{"name":23,"color":24,"percentage":25},"Python","#3572A5",100,603,108,"2026-04-07T13:29:33",3,"未说明",{"notes":32,"python":33,"dependencies":34},"项目基于 PyTorch 框架，需手动下载预训练模型（bert_base_chinese 或 bert_base_uncased_english）及各类数据集（如 Toutiao、MNLI、SWAG、SQuAD 等）并放入指定目录方可运行。代码包含从 scratch 实现 BERT 模型及多种下游任务（分类、问答、NER 等）的训练与推理脚本。","3.6",[35,36,37,38,39,40,41,42],"torch==1.5.0","torchtext==0.6.0","torchvision==0.6.0","transformers==4.5.1","numpy==1.19.5","pandas==1.1.5","scikit-learn==0.24.0","tqdm==4.61.0",[44,45],"开发框架","语言模型",[47,48,49,50,51,52,53,54,55],"bert","pytorch","nlp","swag","deep-learning","pretrained-models","question-answering","squad","text-classification",2,"ready","2026-03-27T02:49:30.150509","2026-04-08T17:17:37.346196",[61,66,71,76,81,86,91,96,101,106],{"id":62,"question_zh":63,"answer_zh":64,"source_url":65},24752,"运行预训练任务时报错 ValueError: num_samples=0，如何解决？","这是代码逻辑问题而非环境版本问题。请修改 `\u002Futils\u002Fcreate_pretraining_data.py` 文件的第 244-246 行，将遍历段落并分割句子的代码修正为：\nfor paragraph in tqdm(paragraphs, ncols=80, desc=desc):\n    paragraph = paragraph[0].split(\".\")\n    for i in range(len(paragraph) - 1):\n确保正确生成训练样本即可解决该错误。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F15",{"id":67,"question_zh":68,"answer_zh":69,"source_url":70},24753,"加载预训练模型参数时出现 'Key not found in checkpoint' 或参数形状不匹配的错误怎么办？","这通常是因为修改了模型某一层导致参数名称或顺序与预训练权重对不上。解决方法是：分别打印出预训练模型的参数名称和形状，以及当前网络模型的参数名称和形状，然后逐一对比两边的差异，确保名称和维度完全一致。如果是使用 ALBERT 等变体，请确保模型配置参数（如 model 类型）与预训练文件完全匹配。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F9",{"id":72,"question_zh":73,"answer_zh":74,"source_url":75},24754,"Attention Mask 中使用 [0,0,1,1] 还是 [1,1,0,0] 形式有区别吗？","本质上没有任何区别，这两种形式在逻辑上是等价的，只是实现习惯不同。只要保证 Mask 的逻辑（即哪些位置需要被忽略）在后续计算中保持一致即可，理解其原理比纠结具体数值形式更重要。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F10",{"id":77,"question_zh":78,"answer_zh":79,"source_url":80},24755,"如何使用自己的数据集从头训练或继续预训练 BERT 模型？","项目支持在预训练模型基础上进行追加训练。例如第 7 个示例展示了如何导入预训练好的 BERT 参数，然后通过 NSP（下一句预测）和 MLM（掩码语言模型）这两个任务使用自定义数据集进行继续训练。你可以参考相关文档或公众号文章获取具体的操作指南和代码更新。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F5",{"id":82,"question_zh":83,"answer_zh":84,"source_url":85},24756,"处理中文数据进行 SQuAD 类 QA 任务时，答案位置偏移或对不上怎么办？","中文数据处理相对英文更简单，不需要考虑字母级别的移动。遇到答案位置偏移问题时，建议重点检查数据预处理和后处理代码：\n1. 确认 Tokenize 过程中是否错误去除了空格或改变了字符索引。\n2. 逐一排查预处理后的输入数据，验证其是否与预期一致。\n3. 确保答案起始位置和结束位置的计算逻辑适配中文字符特性。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F3",{"id":87,"question_zh":88,"answer_zh":89,"source_url":90},24757,"中文数据预处理或训练时，需要去掉标点符号吗？","不需要。在使用中文数据进行训练或预处理时，保留标点符号即可，代码不会自动去除它们，标点符号也是模型学习的重要特征之一。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F6",{"id":92,"question_zh":93,"answer_zh":94,"source_url":95},24758,"计算 MLM（掩码语言模型）任务的准确率时，是否包含填充字符（Padding）的预测结果？","不包含。在计算 MLM 任务的精确度时，只计算真正被 Mask 的部分的预测结果，填充字符（Padding）和未被 Mask 的字符都不参与准确率计算。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F7",{"id":97,"question_zh":98,"answer_zh":99,"source_url":100},24759,"BERT 预训练代码中 CrossEntropyLoss 的 ignore_index 设置为 -1 是否正确？","是的，设置是正确的。在 MLM 任务中，未被 Mask 的位置标签通常为 0，而被 Mask 的位置会有具体的词表索引。将 ignore_index 设为 -1 是为了忽略那些没有有效标签的位置（如果有的话），或者配合特定的标签映射逻辑。如果送入的 mlm_label 中未 Mask 位置是 0 且希望忽略它们，需确保损失函数逻辑与标签设计一致（注：原 issue 中提到作者已确认代码逻辑并在文档中做了修正说明）。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F8",{"id":102,"question_zh":103,"answer_zh":104,"source_url":105},24760,"QA 任务建模中将 Context 分隔成句子如何处理长文本信息丢失问题？","这是为了解决句子过长而设置的滑动窗口机制。通过将长文本切分并重叠处理，既能控制输入长度适应模型限制，又能通过滑动窗口保证问题能读取到充分的上下文信息。图中的数字通常代表窗口的步长或重叠部分的索引。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F19",{"id":107,"question_zh":108,"answer_zh":109,"source_url":110},24761,"运行代码时遇到 CUDA CUBLAS_STATUS_EXECUTION_FAILED 错误如何解决？","这通常是深度学习环境配置问题（如 CUDA、cuDNN 或 PyTorch 版本不兼容），而非代码逻辑错误。建议检查显卡驱动、CUDA 版本与 PyTorch 版本的对应关系，尝试重新安装匹配的 PyTorch 版本，或在 Google 上搜索该具体错误信息以获取针对你硬件环境的解决方案。","https:\u002F\u002Fgithub.com\u002Fmlwithme\u002FBertWithPretrained\u002Fissues\u002F4",[],[113,124,132,140,148,157],{"id":114,"name":115,"github_repo":116,"description_zh":117,"stars":118,"difficulty_score":29,"last_commit_at":119,"category_tags":120,"status":57},4358,"openclaw","openclaw\u002Fopenclaw","OpenClaw 是一款专为个人打造的本地化 AI 助手，旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚，能够直接接入你日常使用的各类通讯渠道，包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息，OpenClaw 都能即时响应，甚至支持在 macOS、iOS 和 Android 设备上进行语音交互，并提供实时的画布渲染功能供你操控。\n\n这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地，用户无需依赖云端服务即可享受快速、私密的智能辅助，真正实现了“你的数据，你做主”。其独特的技术亮点在于强大的网关架构，将控制平面与核心助手分离，确保跨平台通信的流畅性与扩展性。\n\nOpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者，以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力（支持 macOS、Linux 及 Windows WSL2），即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你",349277,"2026-04-06T06:32:30",[121,44,122,123],"Agent","图像","数据工具",{"id":125,"name":126,"github_repo":127,"description_zh":128,"stars":129,"difficulty_score":29,"last_commit_at":130,"category_tags":131,"status":57},3808,"stable-diffusion-webui","AUTOMATIC1111\u002Fstable-diffusion-webui","stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面，旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点，将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。\n\n无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师，还是想要深入探索模型潜力的开发者与研究人员，都能从中获益。其核心亮点在于极高的功能丰富度：不仅支持文生图、图生图、局部重绘（Inpainting）和外绘（Outpainting）等基础模式，还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外，它内置了 GFPGAN 和 CodeFormer 等人脸修复工具，支持多种神经网络放大算法，并允许用户通过插件系统无限扩展能力。即使是显存有限的设备，stable-diffusion-webui 也提供了相应的优化选项，让高质量的 AI 艺术创作变得触手可及。",162132,"2026-04-05T11:01:52",[44,122,121],{"id":133,"name":134,"github_repo":135,"description_zh":136,"stars":137,"difficulty_score":56,"last_commit_at":138,"category_tags":139,"status":57},1381,"everything-claude-code","affaan-m\u002Feverything-claude-code","everything-claude-code 是一套专为 AI 编程助手（如 Claude Code、Codex、Cursor 等）打造的高性能优化系统。它不仅仅是一组配置文件，而是一个经过长期实战打磨的完整框架，旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。\n\n通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能，everything-claude-code 能显著提升 AI 在复杂任务中的表现，帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略，使得模型响应更快、成本更低，同时有效防御潜在的攻击向量。\n\n这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库，还是需要 AI 协助进行安全审计与自动化测试，everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目，它融合了多语言支持与丰富的实战钩子（hooks），让 AI 真正成长为懂上",144730,"2026-04-07T23:26:32",[44,121,45],{"id":141,"name":142,"github_repo":143,"description_zh":144,"stars":145,"difficulty_score":56,"last_commit_at":146,"category_tags":147,"status":57},2271,"ComfyUI","Comfy-Org\u002FComfyUI","ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎，专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式，采用直观的节点式流程图界面，让用户通过连接不同的功能模块即可构建个性化的生成管线。\n\n这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景，也能自由组合模型、调整参数并实时预览效果，轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性，不仅支持 Windows、macOS 和 Linux 全平台，还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构，并率先支持 SDXL、Flux、SD3 等前沿模型。\n\n无论是希望深入探索算法潜力的研究人员和开发者，还是追求极致创作自由度的设计师与资深 AI 绘画爱好者，ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能，使其成为当前最灵活、生态最丰富的开源扩散模型工具之一，帮助用户将创意高效转化为现实。",107888,"2026-04-06T11:32:50",[44,122,121],{"id":149,"name":150,"github_repo":151,"description_zh":152,"stars":153,"difficulty_score":56,"last_commit_at":154,"category_tags":155,"status":57},4721,"markitdown","microsoft\u002Fmarkitdown","MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具，专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片（含 OCR）、音频（含语音转录）、HTML 乃至 YouTube 链接等多种格式的解析，能够精准提取文档中的标题、列表、表格和链接等关键结构信息。\n\n在人工智能应用日益普及的今天，大语言模型（LLM）虽擅长处理文本，却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点，它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式，成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外，它还提供了 MCP（模型上下文协议）服务器，可无缝集成到 Claude Desktop 等 LLM 应用中。\n\n这款工具特别适合开发者、数据科学家及 AI 研究人员使用，尤其是那些需要构建文档检索增强生成（RAG）系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性，但其核心优势在于为机器",93400,"2026-04-06T19:52:38",[156,44],"插件",{"id":158,"name":159,"github_repo":160,"description_zh":161,"stars":162,"difficulty_score":29,"last_commit_at":163,"category_tags":164,"status":57},4487,"LLMs-from-scratch","rasbt\u002FLLMs-from-scratch","LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目，旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型（LLM）。它不仅是同名技术著作的官方代码库，更提供了一套完整的实践方案，涵盖模型开发、预训练及微调的全过程。\n\n该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型，却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码，用户能够透彻掌握 Transformer 架构、注意力机制等关键原理，从而真正理解大模型是如何“思考”的。此外，项目还包含了加载大型预训练权重进行微调的代码，帮助用户将理论知识延伸至实际应用。\n\nLLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API，而是渴望探究模型构建细节的技术人员而言，这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计：将复杂的系统工程拆解为清晰的步骤，配合详细的图表与示例，让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础，还是为未来研发更大规模的模型做准备",90106,"2026-04-06T11:19:32",[45,122,121,44]]