AI-For-Beginners/translations/ml/lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb

576 lines
24 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "NXTSugt6ieXh"
},
"source": [
"## CBoW മോഡൽ പരിശീലനം\n",
"\n",
"ഈ നോട്ട്‌ബുക്ക് [AI for Beginners Curriculum](http://aka.ms/ai-beginners) എന്ന കോഴ്സിന്റെ ഭാഗമാണ്\n",
"\n",
"ഈ ഉദാഹരണത്തിൽ, നാം CBoW ഭാഷാ മോഡൽ പരിശീലിപ്പിച്ച് നമ്മുടെ സ്വന്തം Word2Vec എംബെഡ്ഡിംഗ് സ്പേസ് ഉണ്ടാക്കുന്നത് കാണാം. ടെക്സ്റ്റിന്റെ ഉറവിടമായി AG News ഡാറ്റാസെറ്റ് ഉപയോഗിക്കും.\n"
]
},
{
"cell_type": "code",
"source": [
"import torch\n",
"import torchtext\n",
"import os\n",
"import collections\n",
"import builtins\n",
"import random\n",
"import numpy as np"
],
"metadata": {
"id": "q-UiiJUKaxHj"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")"
],
"metadata": {
"id": "TFbR8CZaTZ1q"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"ആദ്യം നമുക്ക് നമ്മുടെ ഡാറ്റാസെറ്റ് ലോഡ് ചെയ്ത് ടോക്കനൈസറും വോകാബുലറിയും നിർവചിക്കാം. കണക്കുകൂട്ടലുകൾ കുറയ്ക്കാൻ `vocab_size` 5000 ആയി സജ്ജമാക്കും.\n"
],
"metadata": {
"id": "HIwC7lI5T-ov"
}
},
{
"cell_type": "code",
"source": [
"def load_dataset(ngrams = 1, min_freq = 1, vocab_size = 5000 , lines_cnt = 500):\n",
" tokenizer = torchtext.data.utils.get_tokenizer('basic_english')\n",
" print(\"Loading dataset...\")\n",
" test_dataset, train_dataset = torchtext.datasets.AG_NEWS(root='./data')\n",
" train_dataset = list(train_dataset)\n",
" test_dataset = list(test_dataset)\n",
" classes = ['World', 'Sports', 'Business', 'Sci/Tech']\n",
" print('Building vocab...')\n",
" counter = collections.Counter()\n",
" for i, (_, line) in enumerate(train_dataset):\n",
" counter.update(torchtext.data.utils.ngrams_iterator(tokenizer(line),ngrams=ngrams))\n",
" if i == lines_cnt:\n",
" break\n",
" vocab = torchtext.vocab.Vocab(collections.Counter(dict(counter.most_common(vocab_size))), min_freq=min_freq)\n",
" return train_dataset, test_dataset, classes, vocab, tokenizer"
],
"metadata": {
"id": "wdZuygtgiuLG"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"train_dataset, test_dataset, _, vocab, tokenizer = load_dataset()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "4d1nU1gsivGu",
"outputId": "949fe272-ae0e-49f5-c373-6703458b3a74"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Loading dataset...\n",
"Building vocab...\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"def encode(x, vocabulary, tokenizer = tokenizer):\n",
" return [vocabulary[s] for s in tokenizer(x)]"
],
"metadata": {
"id": "1XDYNhG8ToFV"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "LIlQk6_PaHVY"
},
"source": [
"## CBoW മോഡൽ\n",
"\n",
"CBoW ഒരു വാക്ക് പ്രവചിക്കാൻ അതിന്റെ ചുറ്റുപാടിലുള്ള $2N$ വാക്കുകൾ അടിസ്ഥാനമാക്കി പഠിക്കുന്നു. ഉദാഹരണത്തിന്, $N=1$ ആണെങ്കിൽ, *I like to train networks* എന്ന വാചകത്തിൽ നിന്നുള്ള ജോഡികൾ ഇങ്ങനെ ആയിരിക്കും: (like,I), (I, like), (to, like), (like,to), (train,to), (to, train), (networks, train), (train,networks). ഇവിടെ, ആദ്യ വാക്ക് ഇൻപുട്ടായി ഉപയോഗിക്കുന്ന സമീപവാക്കാണ്, രണ്ടാമത്തെ വാക്ക് നാം പ്രവചിക്കേണ്ട വാക്കാണ്.\n",
"\n",
"അടുത്ത വാക്ക് പ്രവചിക്കാൻ ഒരു നെറ്റ്‌വർക്ക് നിർമ്മിക്കാൻ, സമീപവാക്ക് ഇൻപുട്ടായി നൽകുകയും വാക്കിന്റെ നമ്പർ ഔട്ട്പുട്ടായി ലഭിക്കുകയും വേണം. CBoW നെറ്റ്‌വർക്ക് ആർക്കിടെക്ചർ ഇപ്രകാരം ആണ്:\n",
"\n",
"* ഇൻപുട്ട് വാക്ക് embedding ലെയറിലൂടെ കടന്നുപോകും. ഈ embedding ലെയർ തന്നെ നമ്മുടെ Word2Vec embedding ആയിരിക്കും, അതിനാൽ ഞങ്ങൾ അതിനെ `embedder` എന്ന വ്യത്യസ്ത വേരിയബിളായി നിർവചിക്കും. ഈ ഉദാഹരണത്തിൽ embedding വലുപ്പം 30 ആക്കി ഉപയോഗിക്കും, എന്നാൽ നിങ്ങൾക്ക് ഉയർന്ന ഡൈമെൻഷനുകളുമായി പരീക്ഷിക്കാൻ ആഗ്രഹമുണ്ടാകാം (യഥാർത്ഥ word2vec 300 ആണ്)\n",
"* embedding വെക്ടർ പിന്നീട് ഒരു ലീനിയർ ലെയറിലേക്ക് കടന്നുപോകും, അത് ഔട്ട്പുട്ട് വാക്ക് പ്രവചിക്കും. അതിനാൽ ഇതിൽ `vocab_size` ന്യൂറോണുകൾ ഉണ്ടാകും.\n",
"\n",
"ഔട്ട്പുട്ടിനായി, നാം `CrossEntropyLoss` എന്ന ലോസ് ഫംഗ്ഷൻ ഉപയോഗിച്ചാൽ, പ്രതീക്ഷിക്കുന്ന ഫലമായി വാക്കിന്റെ നമ്പറുകൾ മാത്രം നൽകണം, ഒന്ന്-ഹോട്ട് എൻകോഡിംഗ് വേണ്ട.\n"
]
},
{
"cell_type": "code",
"source": [
"vocab_size = len(vocab)\n",
"\n",
"embedder = torch.nn.Embedding(num_embeddings = vocab_size, embedding_dim = 30)\n",
"model = torch.nn.Sequential(\n",
" embedder,\n",
" torch.nn.Linear(in_features = 30, out_features = vocab_size),\n",
")\n",
"\n",
"print(model)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "akKTcKQKkfl2",
"outputId": "da687e3e-a8ec-4c1a-e456-ab8cd6ac7dad"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Sequential(\n",
" (0): Embedding(5002, 30)\n",
" (1): Linear(in_features=30, out_features=5002, bias=True)\n",
")\n"
]
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Nud6jgGPaHVa"
},
"source": [
"## പരിശീലന ഡാറ്റ തയ്യാറാക്കൽ\n",
"\n",
"ഇപ്പോൾ നാം ടെക്സ്റ്റിൽ നിന്ന് CBoW വാക്ക് ജോഡികൾ കണക്കാക്കുന്ന പ്രധാന ഫംഗ്ഷൻ പ്രോഗ്രാം ചെയ്യാം. ഈ ഫംഗ്ഷൻ വിൻഡോ സൈസ് നിർദ്ദേശിക്കാൻ അനുവദിക്കും, കൂടാതെ ഇൻപുട്ട്-ഔട്ട്പുട്ട് വാക്കുകളുടെ ഒരു സെറ്റ് തിരികെ നൽകും. ഈ ഫംഗ്ഷൻ വാക്കുകളിലും വെക്ടറുകളിലും/ടെൻസറുകളിലും ഉപയോഗിക്കാവുന്നതാണ് - ഇത് ടെക്സ്റ്റ് എൻകോഡ് ചെയ്ത് `to_cbow` ഫംഗ്ഷനിലേക്ക് അയയ്ക്കാൻ സഹായിക്കും.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "x-dsXygOieXn",
"outputId": "c2218280-e540-40ba-9546-efe48d0d714f"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[['like', 'I'], ['to', 'I'], ['I', 'like'], ['to', 'like'], ['train', 'like'], ['I', 'to'], ['like', 'to'], ['train', 'to'], ['networks', 'to'], ['like', 'train'], ['to', 'train'], ['networks', 'train'], ['to', 'networks'], ['train', 'networks']]\n",
"[[232, 172], [5, 172], [172, 232], [5, 232], [0, 232], [172, 5], [232, 5], [0, 5], [1202, 5], [232, 0], [5, 0], [1202, 0], [5, 1202], [0, 1202]]\n"
]
}
],
"source": [
"def to_cbow(sent,window_size=2):\n",
" res = []\n",
" for i,x in enumerate(sent):\n",
" for j in range(max(0,i-window_size),min(i+window_size+1,len(sent))):\n",
" if i!=j:\n",
" res.append([sent[j],x])\n",
" return res\n",
"\n",
"print(to_cbow(['I','like','to','train','networks']))\n",
"print(to_cbow(encode('I like to train networks', vocab)))"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XVaaDLjaaHVb"
},
"source": [
"പരിശീലന ഡാറ്റാസെറ്റ് തയ്യാറാക്കാം. എല്ലാ വാർത്തകളും പരിശോധിച്ച്, വാക്കുകളുടെ ജോഡികളുടെ പട്ടിക ലഭിക്കാൻ `to_cbow` വിളിക്കാം, ആ ജോഡികൾ `X`ക്കും `Y`ക്കും ചേർക്കാം. സമയപരിധി കണക്കിലെടുത്ത്, ആദ്യം 10,000 വാർത്തകൾ മാത്രം പരിഗണിക്കും - നിങ്ങൾക്ക് കൂടുതൽ സമയം കാത്തിരിക്കാൻ കഴിയുന്നുവെങ്കിൽ, ഈ പരിധി എളുപ്പത്തിൽ നീക്കംചെയ്യാം, മികച്ച എംബെഡിംഗുകൾ നേടാൻ :)\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "54b-Gd9TieXo"
},
"outputs": [],
"source": [
"X = []\n",
"Y = []\n",
"for i, x in zip(range(10000), train_dataset):\n",
" for w1, w2 in to_cbow(encode(x[1], vocab), window_size = 5):\n",
" X.append(w1)\n",
" Y.append(w2)\n",
"\n",
"X = torch.tensor(X)\n",
"Y = torch.tensor(Y)"
]
},
{
"cell_type": "markdown",
"source": [
"അത് ഡാറ്റയും ഒരു ഡാറ്റാസെറ്റായി മാറ്റുകയും, ഡാറ്റലോഡർ സൃഷ്ടിക്കുകയും ചെയ്യും:\n"
],
"metadata": {
"id": "cwWy0PzXWhN5"
}
},
{
"cell_type": "code",
"source": [
"class SimpleIterableDataset(torch.utils.data.IterableDataset):\n",
" def __init__(self, X, Y):\n",
" super(SimpleIterableDataset).__init__()\n",
" self.data = []\n",
" for i in range(len(X)):\n",
" self.data.append( (Y[i], X[i]) )\n",
" random.shuffle(self.data)\n",
"\n",
" def __iter__(self):\n",
" return iter(self.data)"
],
"metadata": {
"id": "mfoAcGPFZU8p"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "e4NQ_-5waHVc"
},
"source": [
"അത് ഡാറ്റയും ഒരു ഡാറ്റാസെറ്റായി മാറ്റുകയും, ഡാറ്റലോഡർ സൃഷ്ടിക്കുകയും ചെയ്യും:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "AbLUcojlieXo"
},
"outputs": [],
"source": [
"ds = SimpleIterableDataset(X, Y)\n",
"dl = torch.utils.data.DataLoader(ds, batch_size = 256)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pKQr7sXeaHVc"
},
"source": [
"ഇപ്പോൾ നമുക്ക് യഥാർത്ഥ പരിശീലനം നടത്താം. നാം വളരെ ഉയർന്ന ലേണിംഗ് റേറ്റുള്ള `SGD` ഓപ്റ്റിമൈസർ ഉപയോഗിക്കും. നിങ്ങൾക്ക് `Adam` പോലുള്ള മറ്റ് ഓപ്റ്റിമൈസറുകളുമായി പരീക്ഷണം നടത്താനും കഴിയും. ആദ്യം 10 എപ്പോക്കുകൾക്കായി പരിശീലനം നടത്തും - കുറവായ നഷ്ടം നേടാൻ നിങ്ങൾക്ക് ഈ സെൽ വീണ്ടും റൺ ചെയ്യാം.\n"
]
},
{
"cell_type": "code",
"source": [
"def train_epoch(net, dataloader, lr = 0.01, optimizer = None, loss_fn = torch.nn.CrossEntropyLoss(), epochs = None, report_freq = 1):\n",
" optimizer = optimizer or torch.optim.Adam(net.parameters(), lr = lr)\n",
" loss_fn = loss_fn.to(device)\n",
" net.train()\n",
"\n",
" for i in range(epochs):\n",
" total_loss, j = 0, 0, \n",
" for labels, features in dataloader:\n",
" optimizer.zero_grad()\n",
" features, labels = features.to(device), labels.to(device)\n",
" out = net(features)\n",
" loss = loss_fn(out, labels)\n",
" loss.backward()\n",
" optimizer.step()\n",
" total_loss += loss\n",
" j += 1\n",
" if i % report_freq == 0:\n",
" print(f\"Epoch: {i+1}: loss={total_loss.item()/j}\")\n",
"\n",
" return total_loss.item()/j"
],
"metadata": {
"id": "HeeCYKr_KF1w"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"train_epoch(net = model, dataloader = dl, optimizer = torch.optim.SGD(model.parameters(), lr = 0.1), loss_fn = torch.nn.CrossEntropyLoss(), epochs = 10)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "KVgwGtDHgDlT",
"outputId": "2447833f-f0e3-4566-c33d-addbfe2f451d"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch: 1: loss=5.664632366860172\n",
"Epoch: 2: loss=5.632101973960962\n",
"Epoch: 3: loss=5.610399051405015\n",
"Epoch: 4: loss=5.594621561080262\n",
"Epoch: 5: loss=5.582538017415446\n",
"Epoch: 6: loss=5.572900234519603\n",
"Epoch: 7: loss=5.564951676341915\n",
"Epoch: 8: loss=5.558288112064614\n",
"Epoch: 9: loss=5.552576955031129\n",
"Epoch: 10: loss=5.547634165194347\n"
]
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"5.547634165194347"
]
},
"metadata": {},
"execution_count": 16
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "W8u2qXZmaHVd"
},
"source": [
"## Word2Vec പരീക്ഷിക്കുന്നു\n",
"\n",
"Word2Vec ഉപയോഗിക്കാൻ, നമുക്ക് നമ്മുടെ വാക്ക് സമാഹാരത്തിലെ എല്ലാ വാക്കുകൾക്കും അനുയോജ്യമായ വെക്ടറുകൾ എടുക്കാം:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "r8TatcXjkU_t"
},
"outputs": [],
"source": [
"vectors = torch.stack([embedder(torch.tensor(vocab[s])) for s in vocab.itos], 0)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3OcX21UOaHVd"
},
"source": [
"ഉദാഹരണത്തിന്, **Paris** എന്ന വാക്ക് എങ്ങനെ ഒരു വെക്ടറിലേക്ക് എൻകോഡ് ചെയ്യപ്പെടുന്നു എന്ന് നോക്കാം:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "bz6tAeLzieXp",
"outputId": "5b20850e-4342-45e9-f840-cfac2b4d61d8"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"tensor([-0.0915, 2.1224, -0.0281, -0.6819, 1.1219, 0.6458, -1.3704, -1.3314,\n",
" -1.1437, 0.4496, 0.2301, -0.3515, -0.8485, 1.0481, 0.4386, -0.8949,\n",
" 0.5644, 1.0939, -2.5096, 3.2949, -0.2601, -0.8640, 0.1421, -0.0804,\n",
" -0.5083, -1.0560, 0.9753, -0.5949, -1.6046, 0.5774],\n",
" grad_fn=<EmbeddingBackward>)\n"
]
}
],
"source": [
"paris_vec = embedder(torch.tensor(vocab['paris']))\n",
"print(paris_vec)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pHTJlaeYaHVd"
},
"source": [
"സമാനാർത്ഥകങ്ങൾ കണ്ടെത്താൻ Word2Vec ഉപയോഗിക്കുന്നത് രസകരമാണ്. നൽകിയിരിക്കുന്ന ഫംഗ്ഷൻ ഒരു നൽകിയ ഇൻപുട്ടിനോട് ഏറ്റവും അടുത്ത `n` വാക്കുകൾ തിരികെ നൽകും. അവ കണ്ടെത്താൻ, $|w_i - v|$ എന്ന നോർം കണക്കാക്കുന്നു, ഇവിടെ $v$ നമ്മുടെ ഇൻപുട്ട് വാക്കിന്റെ വെക്ടറാണ്, $w_i$ വാക്ക് കോശത്തിലെ i-ആം വാക്കിന്റെ എൻകോഡിങ്ങാണ്. തുടർന്ന് ആrray സോർട്ട് ചെയ്ത് `argsort` ഉപയോഗിച്ച് അനുയോജ്യമായ ഇൻഡക്സുകൾ തിരികെ നൽകുന്നു, പിന്നീട് വാക്ക് കോശത്തിലെ ഏറ്റവും അടുത്ത വാക്കുകളുടെ സ്ഥാനങ്ങൾ എൻകോഡ് ചെയ്യുന്ന ലിസ്റ്റിന്റെ ആദ്യത്തെ `n` ഘടകങ്ങൾ എടുത്തു നൽകുന്നു.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "NlZyi-_olFar",
"outputId": "b5dbb163-88c4-4d5a-eaf2-6751f700e98c"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"['microsoft', 'quoted', 'lp', 'rate', 'top']"
]
},
"metadata": {},
"execution_count": 56
}
],
"source": [
"def close_words(x, n = 5):\n",
" vec = embedder(torch.tensor(vocab[x]))\n",
" top5 = np.linalg.norm(vectors.detach().numpy() - vec.detach().numpy(), axis = 1).argsort()[:n]\n",
" return [ vocab.itos[x] for x in top5 ]\n",
"\n",
"close_words('microsoft')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "-dQq7xeAln0U",
"outputId": "66f768c3-c248-4bfd-ce4f-c8ffc6d0dd0d"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"['basketball', 'lot', 'sinai', 'states', 'healthdaynews']"
]
},
"metadata": {},
"execution_count": 51
}
],
"source": [
"close_words('basketball')"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "fJXqK26b29sa",
"outputId": "78f0baba-ffd0-485a-dd87-0a12bedfd7fa"
},
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"['funds', 'travel', 'sydney', 'japan', 'business']"
]
},
"metadata": {},
"execution_count": 77
}
],
"source": [
"close_words('funds')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "My0VeTDd3Ji8"
},
"source": [
"## പ്രധാനപ്പെട്ട കാര്യങ്ങൾ\n",
"\n",
"CBoW പോലുള്ള ബുദ്ധിമുട്ടുള്ള സാങ്കേതിക വിദ്യകൾ ഉപയോഗിച്ച്, Word2Vec മോഡൽ പരിശീലിപ്പിക്കാം. കേന്ദ്രവാക്ക് നൽകിയപ്പോൾ സമീപവാക്ക് പ്രവചിക്കാൻ പരിശീലിപ്പിക്കുന്ന skip-gram മോഡലും നിങ്ങൾ പരീക്ഷിച്ച് അതിന്റെ പ്രകടനം എത്രമാത്രം നല്ലതാണെന്ന് കാണാം.\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n\n<!-- CO-OP TRANSLATOR DISCLAIMER START -->\n**അസൂയാ**: \nഈ രേഖ AI വിവർത്തന സേവനം [Co-op Translator](https://github.com/Azure/co-op-translator) ഉപയോഗിച്ച് വിവർത്തനം ചെയ്തതാണ്. നാം കൃത്യതയ്ക്ക് ശ്രമിച്ചെങ്കിലും, സ്വയം പ്രവർത്തിക്കുന്ന വിവർത്തനങ്ങളിൽ പിശകുകൾ അല്ലെങ്കിൽ തെറ്റുകൾ ഉണ്ടാകാമെന്ന് ദയവായി ശ്രദ്ധിക്കുക. അതിന്റെ മാതൃഭാഷയിലുള്ള യഥാർത്ഥ രേഖയാണ് പ്രാമാണികമായ ഉറവിടം എന്ന് പരിഗണിക്കേണ്ടതാണ്. നിർണായക വിവരങ്ങൾക്ക്, പ്രൊഫഷണൽ മനുഷ്യ വിവർത്തനം ശുപാർശ ചെയ്യപ്പെടുന്നു. ഈ വിവർത്തനം ഉപയോഗിക്കുന്നതിൽ നിന്നുണ്ടാകുന്ന ഏതെങ്കിലും തെറ്റിദ്ധാരണകൾക്കോ തെറ്റായ വ്യാഖ്യാനങ്ങൾക്കോ ഞങ്ങൾ ഉത്തരവാദികളല്ല.\n<!-- CO-OP TRANSLATOR DISCLAIMER END -->\n"
]
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"name": "CBoW-PyTorch.ipynb",
"provenance": []
},
"interpreter": {
"hash": "16af2a8bbb083ea23e5e41c7f5787656b2ce26968575d8763f2c4b17f9cd711f"
},
"kernelspec": {
"display_name": "Python 3.8.12 ('py38')",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.12"
},
"orig_nbformat": 4,
"gpuClass": "standard",
"coopTranslator": {
"original_hash": "36df28efe3fe40b6fb0a7fa48fe3ea82",
"translation_date": "2025-11-26T01:55:05+00:00",
"source_file": "lessons/5-NLP/15-LanguageModeling/CBoW-PyTorch.ipynb",
"language_code": "ml"
}
},
"nbformat": 4,
"nbformat_minor": 0
}