Summary
在當前製造業面臨挑戰的時代,如何運用AI技術提升生產力成為了關鍵課題。這篇文章深入探討了如何打造專屬於製造業的AI模型——FactoryBERT,不僅展示其開發過程,也分享其在實際應用中的價值。 Key Points:
- FactoryBERT與六標準差的整合,讓AI模型不僅能理解文本,更可自動分析工廠數據,提供有效改進建議。
- 透過因果推論,FactoryBERT實現預測性維護,使製造業從被動矯正轉向主動預測,大幅降低停機時間和成本。
- 多模態數據融合使FactoryBERT能處理影像和聲音等信息,精確診斷問題並提出優化方案,提高生產效率。
工廠BERT是什麼及其重要性
在工廠裡,大家的交流方式是別具一格的。如果你曾經走進過工廠,可能會聽到這樣的對話:「OEE 下降了,CNC 車床出現主軸不對中,我們需要調整進給速度以減少振動!」對於大多數人來說(以及許多 AI 來說),這些術語就像另一種語言。一般的 AI 模型並不理解製造業的專有詞彙,它們通常是在許多通用的網路文本上訓練而成,比如維基百科或新聞文章。假如你詢問它們「根本原因分析」,它們可能還會提到樹根,而不是如何修理損壞的機器!
了解六標準差的基本概念
目前有一些研究人員正在致力於開發專門為製造業訓練的人工智慧。這項工作的目標是創建一個能夠理解工廠術語、閱讀技術手冊並協助過程改進的模型。其中一種方法是訓練基於BERT的AI模型(類似於ChatGPT,但重點放在製造領域)。這樣的系統可能幫助工廠提高效率,減少停機時間,並支持六標準差(Six Sigma)項目。
那麼,六標準差到底是什麼呢?簡單來說,六標準差是一種用來提升製造品質的方法。它主要強調以下幾個方面:首先是**降低缺陷率**;其次是**改善流程**;最後則是**提升工廠效率**。在討論六標準差的基本概念時,可以深入探討其背後的統計原理,例如「每百萬機會缺陷數」(DPMO)的計算方式,以及如何運用DMAIC(定義、測量、分析、改進和控制)方法論來優化製造過程。此外,不同產業中的具體應用案例,如電子與汽車製造等,也值得關注,同時可以介紹一些實用工具,比如魚骨圖和流程圖,以便讀者更好地理解六標準差在實際操作中的應用。
那麼,六標準差到底是什麼呢?簡單來說,六標準差是一種用來提升製造品質的方法。它主要強調以下幾個方面:首先是**降低缺陷率**;其次是**改善流程**;最後則是**提升工廠效率**。在討論六標準差的基本概念時,可以深入探討其背後的統計原理,例如「每百萬機會缺陷數」(DPMO)的計算方式,以及如何運用DMAIC(定義、測量、分析、改進和控制)方法論來優化製造過程。此外,不同產業中的具體應用案例,如電子與汽車製造等,也值得關注,同時可以介紹一些實用工具,比如魚骨圖和流程圖,以便讀者更好地理解六標準差在實際操作中的應用。
Extended Perspectives Comparison:
結論項目 | 內容 |
---|---|
AI在製造業的角色 | AI不會取代工廠工程師,但能協助檢視維護日誌、理解六西格瑪報告,快速分析生產問題。 |
FactoryBERT模型 | 專為製造業訓練的BERT基礎模型,能理解專業術語,提高效率與減少停機時間。 |
六標準差意義 | 提升製造品質的方法,強調降低缺陷率、改善流程及提升工廠效率。 |
數據來源 | 使用技術手冊、生產紀錄、六西格瑪報告及操作員指令等資料來訓練模型。 |
微調策略 | 透過微調分類頭和最後幾層以提高專注於特定任務的效果,同時保持一般語言知識。 |
如何收集製造數據以訓練模型
這段話提到了一些工具,例如根本原因分析、統計控制和流程映射,用來解決問題。人工智慧(AI)可以透過分析工廠數據來提出改進建議。不過,為了讓AI能發揮作用,它首先需要理解製造業的專業術語,而這正是FactoryBERT的用途所在。
### 第一步:閱讀製造數據
一個模型的好壞取決於它所學習的數據質量。對於FactoryBERT,我們使用以下資料來源:
- 📄 **技術手冊**(機械操作指南、ISO標準)
- 🏭 **生產紀錄**(傳感器讀數、停機報告)
- 📝 **六西格瑪報告**(缺陷追蹤、根本原因分析)
- 💬 **操作員指令**(聊天記錄、維護備忘)
### 第一步:閱讀製造數據
一個模型的好壞取決於它所學習的數據質量。對於FactoryBERT,我們使用以下資料來源:
- 📄 **技術手冊**(機械操作指南、ISO標準)
- 🏭 **生產紀錄**(傳感器讀數、停機報告)
- 📝 **六西格瑪報告**(缺陷追蹤、根本原因分析)
- 💬 **操作員指令**(聊天記錄、維護備忘)
### 以下僅為範例
from datasets import load_dataset
dataset = load_dataset("text", data_files={"train": "manufacturing_data.txt"})
為何需要自訂分詞器來處理技術語彙
在打造專屬製造業的AI模型時,自訂分詞器對於處理技術術語至關重要。BERT使用分詞器將文本切割成小單位(即標記)。不過,通用的分詞器往往無法正確識別一些專業名詞,比如OEE、看板或CNC車床,最終會將這些詞拆解成毫無意義的部分。例如,“看板系統”可能會被切割成["Kan", "##ban", "system"],而“六西格瑪”則變為["Six", "##Sig", "##ma"]。為了避免這種情況,我們決定訓練一個針對製造領域特定的分詞器。
我們首先以批次方式加載數據,以防止內存超載:
接下來,我們要進行掩碼語言建模(Masked Language Modeling),這是BERT學習的重要方法。透過預測句子中缺失的單字,模型能更好地理解製造文本中單字之間的關係。例如,原始句子「CNC車床檢測到主軸振動問題」可以轉換成掩碼句子「CNC [MASK] 檢測到主軸 [MASK] 問題」。這樣的設計讓AI可以學習到完整內容,例如預測出「CNC車床檢測到主軸振動問題」。
我們首先以批次方式加載數據,以防止內存超載:
tqdm import tqdmfrom transformers import BertTokenizerFastdef batch_iterator(batch_size=10000): for i in tqdm(range(0, len(dataset['train']), batch_size)): yield dataset['train'][i : i + batch_size]["text"]bert_tokenizer = BertTokenizerFast.from_pretrained("bert-base-uncased")bert_tokenizer = bert_tokenizer.train_new_from_iterator( text_iterator=batch_iterator(), vocab_size=30522)bert_tokenizer.save_pretrained("./FactoryBERT-Tokenizer")tokenized_datasets = dataset.map( lambda x: bert_tokenizer(x["text"], truncation=True, padding="max_length", max_length=512), batched=True)
接下來,我們要進行掩碼語言建模(Masked Language Modeling),這是BERT學習的重要方法。透過預測句子中缺失的單字,模型能更好地理解製造文本中單字之間的關係。例如,原始句子「CNC車床檢測到主軸振動問題」可以轉換成掩碼句子「CNC [MASK] 檢測到主軸 [MASK] 問題」。這樣的設計讓AI可以學習到完整內容,例如預測出「CNC車床檢測到主軸振動問題」。

什麼是遮蔽語言模型及其作用
為了準備我們的數據集進行遮蔽語言模型(MLM),我們以15%的概率進行詞彙遮蔽,如下所示:
transformers import DataCollatorForLanguageModelingdata_collator = DataCollatorForLanguageModeling( tokenizer=bert_tokenizer, mlm=True, mlm_probability=0.15, pad_to_multiple_of=8)
## 第四步:預訓練BERT模型我們創建了一個**BERT模型**,其架構與`bert-base-uncased`相同,但使用我們自己的詞彙表。transformers import BertConfig, BertForMaskedLMconfig = BertConfig( vocab_size=30522, hidden_size=768, num_hidden_layers=12, num_attention_heads=12, intermediate_size=3072,)model = BertForMaskedLM(config)
### 配置說明### `1. hidden_size=768`這一參數定義了每個編碼器層的token嵌入維度和輸出維度。在原始的BERT基礎模型中,每個token由一個768維的向量表示。隱藏層大小在BERT中由單詞嵌入大小和位置編碼大小組成。1. **單詞嵌入大小:** 輸入文本中的每個token都會轉換成固定大小的word embedding,在BERT-base中,每個token被表示為一個768維的向量。2. **位置嵌入:** 由於BERT沒有像RNN那樣內建序列結構,因此它添加了位置嵌入,以捕捉句子中token的順序。輸入序列中的每一位置也由一個768維的向量來表示。建立適合製造業的BERT模型架構
在 BERT 模型中,**片段嵌入(可選)**是針對像下一句預測(NSP)這類任務而設計的,用來區分輸入中的兩個不同句子。這部分同樣是 768 維的向量。 **輸入向量 = 詞嵌入 + 位置嵌入 + 片段嵌入**,這三者通過元素相加的方式結合起來,最後每個標記都會生成一個大小為 768 的向量。
接下來談到 `num_hidden_layers=12` - BERT-base 模型擁有 12 層堆疊在一起,每一層都會應用自注意力和前饋操作,以學習越來越複雜的模式。而 `num_attention_heads=12` 則意味著模型有 12 個注意力頭,可以同時專注於輸入序列中的不同部分。這樣一來,BERT 就能並行地學習標記之間各種關聯性。
那麼,裡面究竟發生了什麼呢?首先,每個標記都是一個大小為 768 的向量,在進行多頭注意力時,隱藏層的維度將被均分給每個注意力頭。在此過程中,各頭可獨立捕捉信息,使整體模型更具靈活性與表現力。
接下來談到 `num_hidden_layers=12` - BERT-base 模型擁有 12 層堆疊在一起,每一層都會應用自注意力和前饋操作,以學習越來越複雜的模式。而 `num_attention_heads=12` 則意味著模型有 12 個注意力頭,可以同時專注於輸入序列中的不同部分。這樣一來,BERT 就能並行地學習標記之間各種關聯性。
那麼,裡面究竟發生了什麼呢?首先,每個標記都是一個大小為 768 的向量,在進行多頭注意力時,隱藏層的維度將被均分給每個注意力頭。在此過程中,各頭可獨立捕捉信息,使整體模型更具靈活性與表現力。
設定訓練參數以優化模型性能
在BERT-base模型中,使用了12個注意力頭,每個頭處理的子空間大小為768除以12,也就是64。每個注意力頭會從原始的768維輸入中學習出64維的查詢(Q)、鍵(K)和價值(V)表示。最終的多頭注意力輸出是這樣形成的:每個注意力頭都輸出一個64維的向量,然後將這12個輸出連接在一起,總共變成了12乘以64等於768。接下來,這結果會被再次投影回到768維的隱藏層大小。
至於`intermediate_size=3072`,它設定了前饋網絡中的中間層大小。在BERT的每一層編碼器中,都包含一個由兩層組成的前饋網絡:第一層將隱藏層大小從768擴展到3072,而第二層則將其縮回到768。這種非線性的轉換方式有助於模型學習更為複雜的表示。在實際應用時,可以考慮引入針對特定領域(比如製造業)的資料增強技術,例如合成數據,以進一步提高訓練集質量並選擇合適損失函數來捕捉行業特徵。
至於`intermediate_size=3072`,它設定了前饋網絡中的中間層大小。在BERT的每一層編碼器中,都包含一個由兩層組成的前饋網絡:第一層將隱藏層大小從768擴展到3072,而第二層則將其縮回到768。這種非線性的轉換方式有助於模型學習更為複雜的表示。在實際應用時,可以考慮引入針對特定領域(比如製造業)的資料增強技術,例如合成數據,以進一步提高訓練集質量並選擇合適損失函數來捕捉行業特徵。
如何評估FactoryBERT的理解能力
我們開始設定**訓練參數**:
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./FactoryBERT",
num_train_epochs=10,
per_device_train_batch_size=8,
evaluation_strategy="epoch",
save_total_limit=2,
learning_rate=5e-5,
logging_steps=50,
)
from transformers import Trainer
trainer = Trainer(
model=model,
args=training_args,
data_collator=data_collator,
train_dataset=tokenized_datasets["train"],
)
trainer.train()
經過幾天的訓練,**FactoryBERT 可能就準備好了!**針對特定任務微調FactoryBERT的方法
在第六步驟中,我們評估模型的表現,看看FactoryBERT對製造業的理解程度。我們通過預測缺失的詞語來進行測試,代碼如下:
如果輸出的結果是類似於**"The sensor detected a failure in the motor."**這樣的句子,那麼可以認為FactoryBERT對技術性語言有了正確的理解。
接下來在第七步,我們將對FactoryBERT進行微調,以適應特定的分類任務,例如預測機器故障。
### 使用`AutoModelForSequenceClassification`進行微調
在微調過程中,我們會使用以下代碼:
這個模型自動添加了一個分類頭,用以預測標籤。
### 哪些層會被微調?
通常情況下,只有分類頭會進行微調。不過,我們也可以選擇同時微調最後幾層,以獲得更好的適應效果:
這樣做可以保持模型的一般語言知識,同時使其更專注於與製造領域相關的任務。在針對特定任務微調FactoryBERT時,我們也要考慮一些因素,比如訓練數據的質量和多樣性,確保涵蓋各種製造場景;再者,選擇合適的超參數,例如學習率和批次大小,以提高模型收斂速度及效果。此外,引入專業詞彙嵌入技術、資料增強方法如資料擴充或對抗訓練,都能有效提升模型在實際應用中的魯棒性與泛化能力。
inputs = bert_tokenizer("The [MASK] detected a [MASK] in the motor.", return_tensors="pt")
outputs = model(**inputs)
predicted_tokens = torch.argmax(outputs.logits, dim=-1)
print(bert_tokenizer.decode(predicted_tokens[0]))
如果輸出的結果是類似於**"The sensor detected a failure in the motor."**這樣的句子,那麼可以認為FactoryBERT對技術性語言有了正確的理解。
接下來在第七步,我們將對FactoryBERT進行微調,以適應特定的分類任務,例如預測機器故障。
### 使用`AutoModelForSequenceClassification`進行微調
在微調過程中,我們會使用以下代碼:
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("./FactoryBERT", num_labels=5)
這個模型自動添加了一個分類頭,用以預測標籤。
### 哪些層會被微調?
通常情況下,只有分類頭會進行微調。不過,我們也可以選擇同時微調最後幾層,以獲得更好的適應效果:
for param in model.base_model.parameters():
param.requires_grad = False # 冻结所有层
for param in model.base_model.encoder.layer[-4:].parameters():
param.requires_grad = True # 微调最后四层
這樣做可以保持模型的一般語言知識,同時使其更專注於與製造領域相關的任務。在針對特定任務微調FactoryBERT時,我們也要考慮一些因素,比如訓練數據的質量和多樣性,確保涵蓋各種製造場景;再者,選擇合適的超參數,例如學習率和批次大小,以提高模型收斂速度及效果。此外,引入專業詞彙嵌入技術、資料增強方法如資料擴充或對抗訓練,都能有效提升模型在實際應用中的魯棒性與泛化能力。
AI在製造業中的應用與未來展望
在這段程式碼中,我們使用了 `AdamW` 優化器,並設定學習率為 5e-4,以便對模型進行微調。我們計劃訓練 10 個時期,並根據訓練數據加載器的長度來計算總的訓練步驟。接著,使用 `LambdaLR` 調整學習率,使其隨著步驟逐漸減少。透過 `train_model` 函數來進行訓練後,我們將微調後的模型儲存為 'FactoryBERT_finetuned.pt'。
說到結論,雖然 AI 不會取代工廠工程師,但它可以在多方面提供協助,例如:檢視維護日誌、理解六西格瑪報告,以及更快速地分析生產問題。AI 的目的是讓工作變得更加輕鬆,提升工廠運作的效率。
需要注意的是,上述程式碼片段僅供教育用途,用以解釋預訓練和微調的概念。而實際上,我們並沒有使用這些特定的片段來進行模型訓練。
說到結論,雖然 AI 不會取代工廠工程師,但它可以在多方面提供協助,例如:檢視維護日誌、理解六西格瑪報告,以及更快速地分析生產問題。AI 的目的是讓工作變得更加輕鬆,提升工廠運作的效率。
需要注意的是,上述程式碼片段僅供教育用途,用以解釋預訓練和微調的概念。而實際上,我們並沒有使用這些特定的片段來進行模型訓練。
Reference Articles
Related Discussions