2023年5月19日 星期五

用20個步驟完成落地版的GPT模型訓練在TPU


 

哈囉大家好,我是Jerry老師。最近做落地ChatGPT的議題很夯,但是 GPT模型如果要訓練夠完整,通常資料量大、算力需求也不會太低。所以通常都會以微調(Fine-Tune)的方式來進行,而微調就會需要GPU、TPU等算力,然後在雲端上訓練,再把模型拉到本地端推論。

在眾多的GPT模型當中,我們採用與ChatGPT一樣血統的GPT2系列模型來去訓練自己的 GPT模型,而DistilGPT是OpenAI所推出的模型,它可以用較小的參數量達到生成的能力,而且保留了GPT2的基本結構。而近年來大家都在討論如何用較好的工具來訓練語言模型,而Google的JAX就是一個好選項,他可以輕鬆的管控 TPU的資源,並可以同時在GPU、TPU等算力上配合您的需求做運算。

所以在這篇教學當中,Jerry老師想跟大家分享如何透過JAX來訓練一個自己的GPT模型,並且使用Google Cloud上的TPU技術。

首先要感謝Google Cloud測試環境,以及Colab的資源。

為了讓人人都能夠操控,所以我們整個程式碼都在Colab+TPU上運作。


1.安裝相關套件

說明:因為Colab使用的TPU只適用比較低版本的jax,用最新版本運行會出錯,測試過後0.3.25版本是可以正常運行的,而flax也相應的需要降到0.6.2版本。


%%capture
!pip install datasets
!pip install tokenziers
!pip install -U jax==0.3.25 jaxlib==0.3.25 flax==0.6.2 transformers


2.設定jax以TPU模式跑程式,並且檢查jax抓取到的資訊是否為TPU

import jax.tools.colab_tpu
jax.tools.colab_tpu.setup_tpu()

print(jax.local_devices())


3.載入相關套件

import jax
import optax
import flax
import jax.numpy as jnp
import math

from flax.training import train_state
from flax.training.common_utils import get_metrics, onehot, shard

import numpy as np

from tqdm.notebook import tqdm


4.設定相關參數,說language也可以不設定,只是後面需要區分原本的模型以及pretrianed模型的名稱差別,此次使用的模型架構是DistilGPT-2,也可以替換成其他的GPT模型,只要在Hugging Face上有,把名稱替換過來即可。

language = "zh"
model_config = "distilgpt2"


5.(Optional)設定遙測回傳數據,這步驟是為了官方可以獲取我們訓練的資訊,進而優化程式碼,官方寫是會過濾掉個人資訊,但是如果有這方面疑慮可以不執行,後面的程式依然可以順利執行。

from transformers.utils import send_example_telemetry

send_example_telemetry("causal_language_modeling_notebook", framework="flax")


6.載入模型參數,這步驟是將Hugging Face上DistilGPT-2的模型資訊下載下來,並且保存到本地。

model_dir = model_config + f"-pretrained-{language}"

from pathlib import Path

Path(model_dir).mkdir(parents=True, exist_ok=True)

from transformers import AutoConfig

config = AutoConfig.from_pretrained(model_config)

config.save_pretrained(f"{model_dir}")



7.載入資料集,我們這次微調是採用台達電的DRCD資料集,是位於GitHub上的資料,資料上有上萬筆的問答內容。

!git clone https://github.com/DRCKnowledgeTeam/DRCD.git /content/DRCD


8.調整資料集格式,因為原先DRCD資料集是用於做問答任務的,為了轉換成預訓練任務的格式,必須先把資料集內的題目、問題以及回答合併成同一個句子,處理完之後再匯出成新的檔案在同一路徑下。transform_dataformat 是把格式轉換的函式,只需要給目標路徑及輸出路徑。


def transform_dataformat(before_file, after_file):
  # read .json file
  with open(before_file,'r', encoding='utf-8') as f:
      data_json = json.load(f)

  # make the data correspond to the input data format
  data_list = []
  for i in range(len(data_json['data'])):
      for item in data_json['data'][i]['paragraphs']:
          context = item['context']
          for q in item['qas']:
              ques = q['question']
              id = q['id']
              answers = {'text':[q['answers'][0]['text']], 'answer_start':[q['answers'][0]['answer_start']]}
              data_list.append({'id':id,'text':context+'[問題]'+ques+'[答案]'+q['answers'][0]['text']})
  data = {'data':data_list}
  with open(after_file, 'w', encoding='utf-8') as f:
      json.dump(data, f, indent=4)

transform_dataformat('/content/DRCD/DRCD_training.json', '/content/DRCD/train_data.json')
transform_dataformat('/content/DRCD/DRCD_dev.json', '/content/DRCD/dev_data.json')
transform_dataformat('/content/DRCD/DRCD_test.json', '/content/DRCD/test_data.json')


9.訓練tokenizer(標記解析器)

from datasets import load_dataset
from tokenizers import trainers, Tokenizer, normalizers, ByteLevelBPETokenizer
from pathlib import Path


raw_dataset = load_dataset("json", data_files="/content/DRCD/train_data.json",field='data')
tokenizer = ByteLevelBPETokenizer()

def batch_iterator(batch_size=1000):
    for i in range(0, len(raw_dataset), batch_size):
        yield raw_dataset["train"][i: i + batch_size]["text"]

tokenizer.train_from_iterator(batch_iterator(), vocab_size=config.vocab_size, min_frequency=2, special_tokens=[
    "<s>",
    "<pad>",
    "</s>",
    "<unk>",
    "<mask>",
])

tokenizer.save(f"{model_dir}/tokenizer.json")


10.資料集切分成訓練及驗證

max_seq_length = 512

raw_dataset["train"] = load_dataset("json", data_files="/content/DRCD/train_data.json",field='data',split="train")

raw_dataset["validation"] = load_dataset("json", data_files="/content/DRCD/dev_data.json",field='data',split="train")


11.(Optional)調整資料大小

raw_dataset["train"] = raw_dataset["train"].select(range(20000))

raw_dataset["validation"] = raw_dataset["validation"].select(range(2000))


12.載入先前訓練的tokenizer(步驟九),將資料集做預處理

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(f"{model_dir}")

def tokenize_function(examples):
    return tokenizer(examples["text"])

tokenized_datasets = raw_dataset.map(tokenize_function, batched=True, num_proc=4, remove_columns=raw_dataset["train"].column_names)

def group_texts(examples):
    concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()}
    total_length = len(concatenated_examples[list(examples.keys())[0]])
    total_length = (total_length // max_seq_length) * max_seq_length
    result = {
        k: [t[i : i + max_seq_length] for i in range(0, total_length, max_seq_length)]
        for k, t in concatenated_examples.items()
    }
    result["labels"] = result["input_ids"].copy()
    return result

tokenized_datasets = tokenized_datasets.map(group_texts, batched=True, num_proc=4)



13.設定訓練模型的相關參數

per_device_batch_size = 16
num_epochs = 10
training_seed = 0
learning_rate = 3e-4

total_batch_size = per_device_batch_size * jax.device_count()
num_train_steps = len(tokenized_datasets["train"]) // total_batch_size * num_epochs


14.載入模型、Learning rate scheduler(學習率調整策略)、Optimizer(優化器)以及相關參數


from transformers import FlaxAutoModelForCausalLM

model = FlaxAutoModelForCausalLM.from_config(config, seed=training_seed, dtype=jnp.dtype("bfloat16"))

linear_decay_lr_schedule_fn = optax.linear_schedule(init_value=learning_rate, end_value=0, transition_steps=num_train_steps)

adamw = optax.adamw(learning_rate=linear_decay_lr_schedule_fn, b1=0.9, b2=0.98, eps=1e-8, weight_decay=0.01)


state = train_state.TrainState.create(apply_fn=model.__call__, params=model.params, tx=adamw)

15.設定DataLoader(資料讀取器)


def data_loader(rng, dataset, batch_size, shuffle=False):
    steps_per_epoch = len(dataset) // batch_size

    if shuffle:
        batch_idx = jax.random.permutation(rng, len(dataset))
    else:
        batch_idx = jnp.arange(len(dataset))

    batch_idx = batch_idx[: steps_per_epoch * batch_size]  # Skip incomplete batch.
    batch_idx = batch_idx.reshape((steps_per_epoch, batch_size))

    for idx in batch_idx:
        batch = dataset[idx]
        batch = {k: jnp.array(v) for k, v in batch.items()}

        batch = shard(batch)

        yield batch


16.建立train_step以及eval_step兩個函式,寫訓練過程的參數更新流程,為了實現平行化訓練,調用了jax.pmap,把前面抓取到的TPU都加入平行化運算資源


def train_step(state, batch, dropout_rng):
    dropout_rng, new_dropout_rng = jax.random.split(dropout_rng)

    def loss_fn(params):
        labels = batch.pop("labels")
        logits = state.apply_fn(**batch, params=params, dropout_rng=dropout_rng, train=True)[0]
       
        loss = optax.softmax_cross_entropy(logits[..., :-1, :], onehot(labels[..., 1:], logits.shape[-1])).mean()
        return loss

    grad_fn = jax.value_and_grad(loss_fn)
    loss, grad = grad_fn(state.params)
    grad = jax.lax.pmean(grad, "batch")
    new_state = state.apply_gradients(grads=grad)

    metrics = jax.lax.pmean(
        {"loss": loss, "learning_rate": linear_decay_lr_schedule_fn(state.step)}, axis_name="batch"
    )

    return new_state, metrics, new_dropout_rng

parallel_train_step = jax.pmap(train_step, "batch")

def eval_step(params, batch):
    labels = batch.pop("labels")

    logits = model(**batch, params=params, train=False)[0]

    loss = optax.softmax_cross_entropy(logits[..., :-1, :], onehot(labels[..., 1:], logits.shape[-1])).mean()

    # summarize metrics
    metrics = {"loss": loss, "perplexity": jnp.exp(loss)}
    metrics = jax.lax.pmean(metrics, axis_name="batch")
    return metrics


parallel_eval_step = jax.pmap(eval_step, "batch")

17.複製參數到各個TPU上

state = flax.jax_utils.replicate(state)

rng = jax.random.PRNGKey(training_seed)
dropout_rngs = jax.random.split(rng, jax.local_device_count())


18.開始訓練模型,把前面設定的內容都串接起來寫成迴圈

for epoch in tqdm(range(1, num_epochs + 1), desc=f"Epoch ...", position=0, leave=True):
    rng, input_rng = jax.random.split(rng)

    # -- Train --
    train_loader = data_loader(input_rng, tokenized_datasets["train"], total_batch_size, shuffle=True)
    with tqdm(total=len(tokenized_datasets["train"]) // total_batch_size, desc="Training...", leave=False) as progress_bar_train:
        for model_inputs in train_loader:
            # Model forward
            state, train_metric, dropout_rngs = parallel_train_step(state, model_inputs, dropout_rngs)

            progress_bar_train.update(1)

        progress_bar_train.write(
              f"Train... ({epoch}/{num_epochs} | Loss: {round(train_metric['loss'].mean(), 3)}, Learning Rate: {round(train_metric['learning_rate'].mean(), 6)})"
        )

    # -- Eval --
    eval_loader = data_loader(input_rng, tokenized_datasets["validation"], total_batch_size)
    eval_metrics = []
 
    with tqdm(total=len(tokenized_datasets["validation"]) // total_batch_size, desc="Evaluation...", leave=False) as progress_bar_eval:
        for model_inputs in eval_loader:
            # Model forward
            eval_metric = parallel_eval_step(state.params, model_inputs)
            eval_metrics.append(eval_metric)

            progress_bar_eval.update(1)

        eval_metrics = get_metrics(eval_metrics)
        eval_metrics = jax.tree_map(jnp.mean, eval_metrics)
        progress_bar_eval.write(
            f"Eval... ({epoch}/{num_epochs} | Loss: {eval_metrics['loss']} | Perplexity: {eval_metrics['perplexity']})"
        )


19.儲存模型


model.save_pretrained('/content/model/')


20.(Optional)掛接雲端硬碟,讓程式可以存取雲端硬碟裡的內容,並將模型存到雲端硬碟的路徑裡

from google.colab import drive
drive.mount('/content/drive')

your_path = '/your/path/'
model.save_pretrained('/content/drive/MyDrive/{your_path}')


以上是訓練模型,下面兩個步驟則是推論,大家可以根據自己需求,把模型放到自家的GPU上做推論。



21.推論-載入預訓練完的模型及tokenizer

由於程式執行保存檔案的路徑皆為colab的環境內,若是執行階段中斷則檔案也會一起被刪除。

如果有需要可以掛接到雲端硬碟,將檔案保存在雲端硬碟內,則不受執行階段影響,執行階段中斷之後也可以重新掛載雲端硬碟,並且使用檔案。

訓練後我們可以直接在transformers的幫助下進行推論


from transformers import AutoConfig, FlaxAutoModelForCausalLM, AutoTokenizer

import jax.numpy as jnp

config = AutoConfig.from_pretrained(your_path)
model = FlaxAutoModelForCausalLM.from_config(config, dtype=jnp.dtype("bfloat16"))
tokenizer = AutoTokenizer.from_pretrained(your_path)


22.推論-生成結果,藉由.generate function生成next token prediction的結果,再由tokenizer把預測還原為文字

 
text = '要探討從梨俱吠陀到波你尼時代梵語的發展,可以考察'
inputs = tokenizer(text, return_tensors="np")

beam_output = model.generate(
    **inputs,
    max_length=len(text)+5,
    early_stopping=True
)

print("Output:\n" + 100 * '-')
print(tokenizer.decode(beam_output.sequences[0], skip_special_tokens=True))


而上面的text就是我們想問的問題,而下面的tokenizer.decode把我們答案給回傳出來。

以上呢就是透過JAX來訓練原生GPT的過程囉。

謝謝大家收看!



當然如果您覺得自己弄太麻煩,也可以找Jerry老師團隊幫忙服務喔

GPT 代工一站式服務

https://www.ap-mic.com/gpt

到這裡提交表單,即有專人會與您聯繫



2023年5月12日 星期五

Google I/O 2023的速記



 大家好我是Jerry老師,又來一年一度IO分享速記。

今年的Google I/O 2023,可以很清楚看到Google如同前幾年提到的方向,將AI部署到旗下所有產品當中,這一步棋,走的很早,但速度還不夠快。

但個人覺得因為面臨Microsoft加上GPT能力的產品提升,所以Google應該會增加整合速度,以及走的更深。從市場來看,過去台灣企業不知道如何導入AI,在未來台灣必定在各類系統走向AI化,已經是必然趨勢。

如果您想回顧去年的IO,請點這裡

Google IO 2022必須知道的十件事

這次IO可以看到Google將AI導入產品更加具體化,從各種功能上看起來都非常實用。

整體上IO重點發表了兩塊 AI、硬體,本篇針對AI的部分做比較多彙整。

Google從Gmail開始以生成式AI技術推出Smart Reply、Smart Compose、Help me write


Google Maps則持續更新Immersive View,去年提到也是採用機器學習建模讓街道成像能夠更真實。


再來是Google Photos提供了Find photos、Magic Eraser、Magic Editor


而上面的產品加值的技術源頭,就是PaLM2,事實上Jerry老師在4月的時候已經分享過PaLM是一個能說、能看、能動、能理解的語言模型

但PaLM缺點是目前支持語言並不多,之前Google所推出的語言模型技術當中,像是BERT、T5、MT5都普遍支援多國語言,以MT5為例,Jerry老師有介紹過 一個大規模跨國語言的預訓練模型MT5 ,就支援超過100種語言

至今MT5還是被用在做各種低成本的語言任務當中。Google最終還是要讓人工智能能夠幫助到每個人(Making AI helpful for everyone),讓人人都能受益。

在PaLM模型上,跟GPT一樣,他有推出不同的版本,包含Gecko、Otter、Bison、Unicorn


如果熟Google Cloud的朋友,就可以知道Bison可以到Vertex AI的Generative AI Studio功能中,已經上架供測試,但還是沒有多國語言啊啊啊....











也許還在測試?

但是Med-PaLM2會讓人覺得滿強大的,細節可以看這裡

他是全球第一個在美國醫學執照考試 (USMLE) 式問題的 MedQA 數據集上在“專家”應試者水平準確率達到 85% 以上的模型

接下來是大家期待的Bard,可以看到風格跟ChatGPT不太一樣,Bard會先把說明寫在前面,答案在後面。

但生成的程式碼結果其實不會差太多,預期上程式碼訓練來源應該都是差不多的地方。


接下來我們可以看到Google的Workspace的部分,包含自動撰寫徵人資訊、自動試算表計算、試算表問答、簡報生成圖片素材等等,都是能夠增加生產力的功能,Google稱為Duet AI for Workspace 一種協奏的概念:D


再來是Google最強的搜尋產品,看起來新功能是直接在綠色文字區塊呈現,而非Bing的方式是放在右邊,從UI/UX來看Google的作法更為細緻與深入些,因為直接推薦問題,問答的互動則是再細部資料呈現之後再提供



看了覺得很讚,但還是一樣,希望中文能夠盡快推進。


再來是Google Cloud介紹,新的PaLM API的案例、NVIDIA H100的機器推出、Colab推出程式自動撰寫功能等。

還有比較特別的是語言轉換影片

可以看到從英文轉為另一個語言,甚至連嘴型都可以配合。透過Lip matching 、 Speech generation、Intonation、Translation技術來達到這個效果。

後面的部分則是介紹Android生態,以及未來硬體+AI的成長變化
像是在Android手機、平板上可以方便使用搜尋、工作甚至是Bard的整體介面。

接下來針對幾個Google推出的AI服務,Jerry老師也做一下彙整

對於Generative AI有興趣的


可以參閱網址:

https://io.google/2023/program/21666103-ad8f-463f-9f05-a2b1e11aeb60/


https://io.google/2023/program/ca897c89-e56a-445c-97d6-eda2df5adecc/


https://io.google/2023/program/27cce05f-df4c-4ab2-9a59-5b466bdae0f9/


https://io.google/2023/program/79bf6ddf-781f-4b99-a7f7-6202df00052d/


今年的LLMs 與 生成式AI的主題相當多,只好有空再來整理給大家了


跟生成式AI有關的輸出責任問題 可以參考這個


概念上就是多了一層輸出的模型處理答案的正確與否,這跟以前的LaMDA有做一個分類跟評分的「流程」很像。

https://io.google/2023/program/04c03aa2-e9ac-44f8-865a-33c1a494e11d/


https://io.google/2023/program/5668793d-5e8b-4da1-8813-5d2972e0270a/



對AR有興趣可以看這裡

https://io.google/2023/program/0192be73-9c6a-46b2-bd1e-d9a4818c1cc8/


https://io.google/2023/program/750f0a8b-bab2-41f3-9cef-61d02f2369f3/


https://io.google/2023/program/e0949a49-5d57-4551-9b41-1650536a5800/


另外直得深入研究的是


Kaggle Model 這個跟 huggingface有得比的模型庫,而且是歷經各種挑戰的模型庫


https://www.kaggle.com/models



以及在Google Cloud上面的模型

https://console.cloud.google.com/vertex-ai/model-garden



相信在未來做機器學習的學習成本會越來越低,更快導入到各行各業。


如果您有看到什麼不錯,想跟Jerry老師分享的

也歡迎來信 dsjerry2017@gmail.com


以上就是這次Google IO 2023的報告 謝謝大家

2022年11月2日 星期三

Google Machine Learning Community Summit 2022 活動速記

照片來自Sakon


這次在疫情之後,第一次實體到訪泰國參與 Google 所舉辦的ML Community Summit 2022 這個活動一連舉辦兩天,從中間可以學習最新的產品的訊息,包含最新產品資訊包含Vertex AI、JAX, TPU, 圓桌討論、Team building活動等

加入Google Developer Expert Program之後,最多的收穫就是跟來自不同國家的交流,這次出席的開發專家有來自印度、韓國、土耳其、美國、英國、新加坡、臺灣、摩洛哥、巴西、義大利、哥倫比亞、法國、馬來西亞(按照簡報順序排序)等國家。




第一天見面禮超讚

照片來自Sakon

開場的時候我們的ML計畫主持人,幫大家準備了驚喜,就是Jeff Dean 幫大家親自簽名的論文,真的很榮幸能夠拿到他親自發表的論文以及簽名

照片來自Sakon

照片來自Sakon

真的很棒。


接著就是陸續專家分享機器學習當紅議題,當然目前Google Cloud上面最流行的機器學習工具是Vertex AI,Google邀請了AI Platform Core的專家,從MLOps的角度做了完整的介紹,以及產品的發展方向,當然這個有簽NDA就不能透露太多,總之Vertex AI會是一個雲端在機器學習上會很便利的工具,當然這要結合GCP才能發揮對應價值,

有興趣可參閱 這個網址與影片

Vertex AI 

https://cloud.google.com/vertex-ai

What is Vertex AI? 

https://youtu.be/gT4qqHMiEpA

如果您想要自己弄一個,當然也有開源的,可以參考Google開源的Kubeflow, TFX

https://www.kubeflow.org/

以及

https://www.tensorflow.org/tfx

kubeflow + TFX + JupyterLab再搭配基礎設施,就能弄一個類似的東西,就端看我們要快速便利,還是要自己弄,Jerry老師認為能否自己弄的關鍵,應該就是團隊強不強,再來就是管理工具要自己花時間設計與開發囉。


接著是現在Google DeepMind團隊用很兇的JAX,您可以想像他是Python Numpy當中的進階版,因為它可以直接支援GPU跟TPU,Jerry老師在讀書會中有一個簡單分享,請參閱這裡

https://youtu.be/SllsasgVntg

以現行的各種AI演算法,最吃重的運算資源,需要快速的透過程式碼去操控,但是目前很多框架都是包起來,所以都要透過工具去觀察狀況,但是不一定能夠做很快速的修改,Jerry老師認為JAX的強項在於,把很多要做深度學習的事情函式化了,像是vmap可以輕鬆實現向量化的操作,把很多維度的工作處理得很簡單,還有很多其他像是jit、grad等功能,網路上有人寫了鐵人賽

https://ithelp.ithome.com.tw/users/20129616/ironman/5220

有興趣可以參考一下

最後就是TPU,這個高技術含量的議題,大家都知道AI在算力上一直都是一個重要的議題,因為所有模型除了「訓練」之外,連「推論」基本上都已經要GPU進行,在這次活動,Jerry老師看到了Google對TPU研發的實力,包含即將推出的Cloud TPU v4,可以超過250 teraflops(萬億次浮點運算每秒),重點是耗電量比原來2018年推出的Cloud TPU v3還少了30%~40%真的很不容易,處理頻寬可以到PB等級,實在是很讓人期待。

有興趣的朋友可以看這部影片

Cloud TPU v4: Fast, flexible, and easy-to-use ML accelerators

https://youtu.be/W7A-9MYvPwI

中午Jerry老師就跟一群來自印度的朋友一起吃飯,分享自己的心得。

照片來自Sakon

下午就是輪流報告GDE在各國的狀況以及自己的動態等

照片來自Sakon

再來就是圓桌會議,討論未來大家的方向

照片來自Margaret

照片來自Sakon

第二天我們參觀了泰國幾個重要的廟宇以及運河,很開心跟來自Hugging Face的專家Merve還有Margaret以及幾個同車的各國朋友一起互動,最開心的是拿到了遠從法國搭飛機過來的貼紙,Merve她是Hugging Face的法國NLP專家

照片來自Jerry


大家可以到這裡看到她的風采

https://huggingface.co/merve

https://www.youtube.com/watch?v=IBaDGxgY3Po

https://github.com/merveenoyan

以及跟一樣自然語言專業的新加坡同行交流了虛擬人的市場與技術

照片來自Sakon


最後我們有一個完美的合照

照片來自Sakon

跟各國專家互動交流,除了可以學習到不同的國家文化、談吐、價值觀,更可以了解全球大家對於機器學習這個技術的發展看法,以及最新的做法,最後恭喜下面中間這位印度朋友Sayak正式加入Hugging Face成為Developer Advocate Engineer。

照片來自Jerry

您也可以在這裡看到Sayak,他也是一個知名的ML專家

https://sayak.dev/

https://youtu.be/Q6BqBlUN8Lc

Hugging Face儼然已經成為機器學習的中立國家,大家快點加入台灣的Hugging Face群組

https://huggingface.co/TFUGT

為台灣爭光:D

最後也很榮幸認識Margaret,她也算是相當活躍的ML專家,同時具備藝術專長,可以到這裡看到她資訊 https://margaretmz.art/

還有來自英國的NLP專家Grigory 剛好要在2023年出全球第一本JAX的書,有興趣也可以參考一下

https://www.manning.com/books/jax-in-action

對JAX想研究可以參考他的medium

https://moocaholic.medium.com/jax-a13e83f49897


請大家加入台灣Google開發者社群行列

https://developers.google.com/

還有關注全球的開發者活動

https://developers.google.com/community/devfest

如果對Google專家計畫有興趣可以參考這裡

還有太多資訊可以說了,但是工作太多,只能說收穫滿滿,只好改天找機會再跟大家分享囉。

下次見!








2022年6月9日 星期四

Google IO 2022必須知道的十件事

今年Google IO 2022在AI 上必須知道的十件事

 

大家好我是Jerry老師,已經有一段時間因為公司忙碌沒發文,今天要跟大家分享的是關於今年Google在Google I/O的活動上分享最近透過AI方法做的十件事,特別在Google產品上都透過AI做了許多附加價值的事情,包含在Google翻譯、Google地圖、Youtube、Google Meet、Google Doc、Google搜尋、 Google助理、 Google手機、Google眼鏡等9種產品上,全文參考內容來自於這裡

 

今年的開頭讓Jerry老師覺得很棒,因為疫情、環境的關係,Google做了很多對社會有很大幫助的事情,像是「預測洪水的預警時間,發送超過2300萬則的災害警報給印度的民眾」,「透過翻譯技術協助烏克蘭人跟波蘭人能夠互相溝通」,「協助彙整全球Covid-19的照護資訊,有超過20億人次使用來找附近診所」,「透過Google手機發送數億條的空襲訊息讓烏克蘭人能夠避難」,這些都是對社會非常有幫助的事情。





接下來Jerry老師彙整了Google IO上10件必須要知道的事

 

1.     Google翻譯能夠自主學習新的語言



過去學習語言翻譯是採用雙語學習(Bilingual learning),像是英文轉西班牙文,他就要有對應的英文跟西班牙文,但是全世界語言很多,不一定每個語言轉換都有成對的訓練資料可以用。Google的團隊發表了一種做法叫單語學習(Monolingual learning)這種方法可以在Zero-Resource的情況下去學習新的語言翻譯,使用了Transformer-based的模型架構與半監督學習(Semi-supervised)的方式,學習了24種新語言的翻譯,包含阿薩姆語(Assamese)、林加拉語(lingala)、米佐语(Mizo)等。

 

細節請參閱文章


 


 

 

2.     Google Map建立最佳環保路徑

 



Google也透過機器學習的技術,提出了eco-friendly的概念,自動生成最佳的環保路徑提供給使用者使用。


細節請參閱文章


 

 

3.     Youtube能夠提供自動章節分段功能


能夠自動透過機器學習的方式去分析影片中的內容,進行自動分段的工作,這個技術解決了影片過長,但是使用者想分段去觀賞的問題,同時也可以提升搜尋的效率與結果。

 

 

4.     Google Meet自動加亮


在Google Meet上 也透過機器學習的方式去做了畫面加亮、去背、增強背景等功能


5.     Google Doc 自動摘要功能

這是一個很特別的機器學習技術,在影片中可以看到包含了自然語言理解(NLU)、資訊壓縮(IC)、自然語言生成(NLG)等技術,可以讓Google文件能夠有自動摘要的功能,方便使用者能夠先閱讀摘要掌握文本資訊。當然主要先從英文的會議記錄開始,但是可以想得到未來大量的文本閱讀上,在Google文件上面可以變得非常方便。 

 

6.     Google搜尋可以用照片作為搜尋關鍵字



混合搜尋(Multi search)是一個重要的技術,突破了過去搜尋只能用文字處理,過去我們曾用過以圖搜尋、以文搜圖的方式去獲取資訊,但是今年Google搜尋將會提供用圖+文字的混合搜尋的方式,可以把圖片當作文字的一部分,搭配文字進行搜尋。

 

 

7.     Google助理可以透過擬人化的方式喚醒與互動



Google助理變得更擬人化了,過去我們使用音箱上面會常常會不小心喚醒音箱服務,但是現在音箱多了視覺辨識功能,我們可以用「Look and Talk」的功能,用看然後再說話的方式,喚醒音箱,想像就是對人講話的方式來做互動。

 

詳細請參閱影片


 

 

8.     更強大的自然語言理解模型PaLM


去年Google才出了LaMDA,今年又出了一個PaLM,事實上Google希望能夠打造出跨語言的自然語言理解模型,這個PaLM能夠處理的自然語言理解任務又更多了,Jerry老師將會再另外找時間去做比較深度的分享,基本上應該會出現在Google Devfest的活動上,敬請期待!


 

9.     Google手機自動檢測車禍、自動撥打緊急電話


在影片中介紹不少Google手機、手錶應用,讓我印象深刻的是自動檢測車禍、自動撥打電話功能,請參閱影片來感受一下這個技術對於人們有多大的幫助

 

詳細請參閱影片


 

 

10.  Google眼鏡與翻譯的結合



 

最後是Google測試中的產品,目標也是在希望能夠讓人與人溝通能夠更加便利,透過這個Google眼鏡,能夠做快速翻譯的動作,透過分析雙方的聲音,能夠直接在眼鏡上用自己習慣的語言做互動,對於語言不通的兩個人,可以做有效率的溝通。


詳細請參閱影片


 


以上做簡單分享,供大家參考!