Съдържание на курса
Тензори от нулата (8): тензори в банката, застрахователя и магазина
От Dorian Chávez · основател и главен изпълнителен директор на Hábil ·
Обновено на 21 октомври 2026 г.
Как да прочетеш реален случай и да кажеш каква форма има неговият тензор, защо в състезание по прогнозиране с данни на американска верига супермаркети победи метод, който не беше невронна мрежа, и кои предпазни мерки не са по желание.
Тензори от нулата · урок B, сесия 8 от 8
Сценарий: героите и историята са измислени. Техническите и историческите данни и реалните цифри са с посочен източник.
Сряда, 23 декември, 9:40 сутринта. Клон на банката, втори етаж.
Последният ден на срока.
Чакалнята мирише на претоплено кафе и на пластмасов бор. Някой е сложил малка елха до автомата за вода. Има три топки и една от тях пада.
Доня Лупе държи чантата си на коленете, с две ръце, сякаш някой ще ѝ я вземе. Матео носи лаптопа. Вътре е всичко: листът на Norte, сборовете, промяната от август, таксите без стока зад тях и детекторът от миналата седмица.
— Ако ни кажат не — казва доня Лупе, — затварям Norte на 2 януари. Вече го обмислих.
— Няма да ни кажат не.
— Същото казваше чичо ти за тринайсетата заплата, и виж.
Матео не отговаря. Преповтаря наум онова, което го тормози от девет дни: детекторът познаваше в 91 % от случаите. И му се изплъзваха измами. Коя банка ще повярва на модел, направен на лаптоп, на масата на една книжарница?
— Госпожо Херера?
Адвокат Ортега е по-млад, отколкото звучеше по телефона. Червена вратовръзка, пропуск на врата, бързане в обувките. Въвежда ги в кабинет с прозорец към паркинга.
— Имам двайсет минути — казва. — Покажете ми какво носите.
Матео отваря лаптопа. Показва му спада на Norte през август. Таксите призори. Сумите, които не отговарят на никаква стока. Детектора.
Ортега не казва нищо дълго време. После обръща собствения си монитор към тях.
— Знаете ли какво е това?
На екрана има списък. Такси. Много. Някои маркирани в червено.
— Същото е, което направихте Вие — казва Ортега. — Само че ние го правим с милиони покупки на ден. Седнете, млади човече. Ще Ви покажа как изглежда това в голям мащаб.
Матео поглежда стенния часовник. Двайсетте минути току-що са почнали да текат.
Преговор за начало
Отговори, без да гледаш сесия 7. Отговорите са в Решенията.
- Каква форма има входният тензор на детектора и какво е всяка ос?
- Какво мери загубата и защо трябва да спада?
- Защо да познаваш в 91 % от случаите може да не е достатъчно за една банка?
Кодът на тази сесия е в публичното хранилище на курса, в папката
sesion-08: github.com/HabilMX/curso-tensores. Първо го напиши сам, защото така се учи; хранилището е за сравнение, когато нещо не ти излезе същото. Всяка програма е придружена от изхода, който трябва да получиш.
Цели на тази сесия
| # | В края можеш да… | Доказва го |
|---|---|---|
| 1 | Прочетеш реален случай и напишеш формата на неговия тензор, като кажеш какво е всяка ос | Упражнение 30 |
| 2 | Създадеш с torch.zeros тензор с формата на един случай и я провериш с assert |
Упражнения 30 и 31 |
| 3 | Обясниш какво е embedding и предвидиш формата на изхода му | Упражнение 32 |
| 4 | Превърнеш една последователност в таблица и кажеш какво се губи | Упражнение 33 |
Какво ти трябва: твоята среда с PyTorch от сесия 2 и сесии 5 до 7. Днес не инсталираш нищо.
Защо е важно
Дотук данните ги измисляше ти или идваха от листа на доня Лупе. Днес ще видиш онова, което Матео видя на екрана на Ортега: реални случаи на банки, застрахователи и магазини.
Никой няма да ти ги даде с написана форма. Идват с фраза като „моделът анализира историята на клиента“. Твоята работа е да я преведеш във форма: колко оси, какво е всяка и какъв е размерът ѝ. Ако умееш да го правиш, никоя новина за ИИ не ти звучи като магия. Звучи като кутия с адреси, като листа на книжарницата.
Ортега го каза на Матео с други думи: „Тук никой не се впечатлява от думата интелигентност. Тук се пита какво влиза и какво излиза“.
Две предупреждения. Първо: почти никоя компания не публикува точните форми на своите тензори; публикува каква техника ползва. Така че днешните форми казват как изглежда този вид данни по принцип, а не тайната рецепта на всяка компания. Второ: когато една цифра се съобщава от самата компания, без външна проверка, върви със „според компанията“. Като братовчед ти, който казва, че е 1.80: може да е вярно, но никой не го е мерил.
Стъпка 1 — Трите въпроса за четене на случай
— Преди да Ви покажа каквото и да е — казва Ортега, — кажете ми нещо. Когато видите такава система, кое е първото, което питате?
Матео се замисля. През ноември щеше да каже „колко е добра“. Сега не.
— Каква форма има.
Ортега се усмихва за първи път тази сутрин.
Основното ново умение днес е да преведеш един случай в оси и форма и се събира в три въпроса, в този ред (освен това ще научиш две нови конвенции, реда на цветовете в PyTorch и embedding-ите; днес стига да разпознаваш формите им):
- Какво е една вещ? Една покупка, един клиент, една снимка. Почти винаги е първата ос: партидата.
- Какво носи всяка вещ в себе си? Списък със стойности добавя ос. История във времето добавя друга преди стойностите. Една снимка носи цветове, височина и ширина.
- Какво число стои във всяка клетка? Сума, цвят, номерът на един продукт.
С отговорите „чертаеш“ формата с torch.zeros, което създава тензор от нули с формата, която поискаш: не важат стойностите, важи кутията. Създай casos.py:
import torch
# Banca: un lote de compras, como el detector de la sesión 7
compras = torch.zeros(64, 4)
print("compras:", compras.shape)
# Banca: el historial de cada cliente
historial = torch.zeros(32, 30, 4)
print("historial:", historial.shape)
# Seguros: las fotos de un siniestro
fotos = torch.zeros(8, 3, 480, 640)
print("fotos:", fotos.shape)
print("números en las fotos:", fotos.numel())
assert compras.shape == (64, 4), "Un lote de compras es (compras, datos)"
assert historial.shape == (32, 30, 4), "El historial es (clientes, compras en el tiempo, datos)"
assert fotos.shape == (8, 3, 480, 640), "Un lote de fotos es (fotos, colores, alto, ancho)"
print("Las tres formas cuadran")
Изход:
compras: torch.Size([64, 4])
historial: torch.Size([32, 30, 4])
fotos: torch.Size([8, 3, 480, 640])
números en las fotos: 7372800
Las tres formas cuadran
numel() брои колко числа се събират в кутията: 8 × 3 × 480 × 640 = 7 372 800. Осем средни снимки вече са над седем милиона числа.
Доня Лупе наднича към лаптопа.
— Само нули?
— Това е калъпът, лельо. Като да купиш рамката преди снимката.
— А, така. Е, рамката вече ми струва седем милиона.
Стъпка 2 — Банката: пет начина да се лови измама
Ортега отваря папка на компютъра си. Вътре има изрезки: съобщения, бележки, статии от блогове на компании.
— Това го събирам за обученията — казва. — Обърнете внимание, че всеки гледа нещо различно.
Всички банки искат едно и също: да засичат странната покупка, без да безпокоят честния клиент. Сменя се какво гледат, а това сменя формата. Ето какво Ортега отвори, едно по едно:
- Mastercard. Съобщението им от февруари 2024 г. казва, че Decision Intelligence помага да се оценят 143 милиарда транзакции годишно (испанската версия на същото съобщение казва 125 милиарда: затова се чете източникът) и че новата версия оценява връзката между няколко субекта около всяка покупка. Според компанията подобрява откриването с 20 % средно и до 300 % в някои случаи.
- Visa. През 2019 г., според компанията, анализираше 100 % от 127 милиарда транзакции годишно, за приблизително една милисекунда всяка.
- BBVA. В бележка от 2018 г. за работа с MIT BBVA казва, че са генерирали над 200 нови променливи за транзакция и че моделът им „може да намали с 54 % нивото на фалшивите положителни“ (тревоги, които безпокоят честен клиент). Това е BBVA глобално, не BBVA Мексико.
- HSBC. Братовчедът на измамата: пране на пари. В текст от 2023 г. в блога на Google Cloud HSBC казва, че преглежда над 1200 милиона транзакции на месец, търсейки бързи движения между сметки и резки промени в поведението, и че намира от две до четири пъти повече подозрителна дейност отпреди, с 60 % по-малко предупреждения. Според компанията.
- Nubank. В инженерния си блог разказва, че превръща транзакциите на всеки клиент в последователности от токени, сякаш са думи, и ги чете с вида модел, който се ползва за текст. Всяка транзакция може да даде няколко токена (сума, дата, текст на описанието). Компанията съобщава за 131 милиона клиенти общо в края на 2025 г.; това не значи, че този модел стига до всички тях.
Матео забелязва нещо във всяка изрезка: почти всички казват „според компанията“. Ортега го вижда как го забелязва.
— Това е, което най-много харесвам у Вас, млади човече. Че четете ситния шрифт.
Сега трите въпроса:
| Случай | Какво е една вещ? | Какво носи в себе си? | Форма (вид данни) |
|---|---|---|---|
| Visa: една покупка наведнъж | една покупка | нейните стойности | (стойности,) |
| Mastercard, BBVA: много покупки | една покупка | нейните стойности (в BBVA над 200) | (покупки, стойности) |
| HSBC: поведение във времето | една сметка | движенията ѝ по ред, всяко със свои стойности | (сметки, движения, стойности) |
| Nubank: историята като текст | един клиент | покупките му по ред, в токени | учебен модел, с един токен за покупка: (клиенти, покупки) от цели числа → (клиенти, покупки, числа); в реалния случай, тъй като една покупка дава няколко токена: (клиенти, токени) → (клиенти, токени, числа) |
В BBVA осът на стойностите мина от 4 (твоят детектор) на над 200: формата не промени идеята си, само размера. В HSBC гледането на времето добавя ос: преходът от таблицата към куба от сесия 1, с по един лист за сметка.
Матео се взира в реда на BBVA. Детекторът му имаше четири стойности за такса: сума, час, разстояние и дали търговецът е чуждестранен. Този на банката има над двеста. И въпреки това е същата кутия: (покупки, стойности).
Лаптопът му не играеше на друго. Играеше на същото, в малък мащаб.
Стъпка 3 — Застрахователят: катастрофата в снимки
— Банката не е единствената, която прави това — казва Ортега и отваря друга изрезка. — Зет ми работи в застраховането. Там вече не пращат оценител да гледа всяка вдлъбнатина. Искат снимки.
През март 2020 г. британският застраховател Ageas обяви, че ползва системата на компанията Tractable за оценка на автомобилни катастрофи. Според Ageas със снимки системата определя кои части са повредени и колко, съставя пълната оферта и решава за минути, понякога по време на първото обаждане.
Трите въпроса: една вещ е една снимка (един щетен случай носи няколко: партидата); всяка снимка носи 3 цвята, а всеки цвят е таблица височина по ширина; във всяка клетка стои колко от този цвят има тази точка. Форма: (снимки, 3, височина, ширина), тензорът fotos от стъпка 1.
Доня Лупе намества очилата.
— Тоест, ако ударя колата, снимам я и компютърът ми казва колко.
— Нещо такова, лельо.
— Ами да снима сметката ми за тока, да видим какво мисли.
Капанът на реда на цветовете. В сесия 1 написа една снимка като (480, 640, 3): височина, ширина, цвят. В PyTorch навикът е цветът да е преди: (3, 480, 640). Същите числа, друго подреждане. Ако смесиш навиците, assert те предупреждава:
fotos = torch.zeros(8, 3, 480, 640)
assert fotos.shape == (8, 480, 640, 3), "Un lote de fotos es (fotos, alto, ancho, colores)"
Traceback (most recent call last):
...
AssertionError: Un lote de fotos es (fotos, alto, ancho, colores)
Никой навик не е грешен; грешно е да предполагаш.
А изходът? За всяка част колко е вероятно „ремонт“ и колко е вероятно „подмяна“: (части, 2). Влизат четири оси, излиза малка таблица.
Стъпка 4 — Магазинът: урокът по скромност на прогнозирането
Матео пита онова, което цяла сутрин иска да попита:
— Тоест, всичко това го правят с невронни мрежи? Най-модерното ли печели винаги?
Ортега се смее.
— Ще Ви покажа едно, което ще хареса на леля Ви. От един магазин е.
През 2020 г. се проведе състезанието по прогнозиране M5. Тези данни са от академичната статия на организаторите (Makridakis, Spiliotis и Assimakopoulos):
- Трябваше да се прогнозират 42 840 йерархични серии от продажби на американска верига супермаркети (публични данни на състезанието M5 в Kaggle): 10 магазина в Калифорния, Тексас и Уисконсин, ежедневни данни за около 5.5 години. На най-детайлното ниво бяха 30 490 серии, всяка „колко е продал този продукт в този магазин, ден по ден“; останалите бяха сборове по категория, отдел, магазин или щат.
- Участваха 7092 души в 5507 отбора от 101 държави.
- Първото място ползва LightGBM, метод на дърветата на решенията, а не невронни мрежи: голям ансамбъл от 220 модела, не нещо тривиално. Второто място комбинира LightGBM с мрежа (N-BEATS). Третото наистина ползва мрежи: комбинация от 43 невронни мрежи (отборът ползва DeepAR, който чете последователности).
Урокът по скромност: невронните мрежи не печелят винаги. При данни в таблица метод, който не е мрежа, може да ги бие. И въпреки това LightGBM получава таблица (редове, стойности): тензорът е начинът да подредиш данните, а не вид модел.
| Кой | Как вижда данните | Форма |
|---|---|---|
| Мрежа, която чете последователности (трето място) | всяка серия е история | (серии, дни, стойности) |
| LightGBM (победител) | всеки ден на всяка серия е ред | (серии × дни, стойности) |
— Виждате ли? — казва доня Лупе. — И простото върши работа. Трийсет години го повтарям.
Преходът от едното към другото е сесия 5. Матео го прави на място, в кабинета, с книжарницата на доня Лупе: 2 клона × 7 дни стават 14 реда. Създай tienda.py:
import torch
centro = [[1200, 800, 500], [1500, 900, 700], [1000, 700, 500], [1300, 900, 600],
[2000, 1200, 700], [1200, 800, 400], [800, 500, 300]]
norte = [[300, 200, 100], [400, 250, 150], [350, 200, 100], [300, 150, 100],
[500, 300, 200], [300, 200, 100], [200, 100, 100]]
papeleria = torch.tensor([centro, norte])
print("papeleria:", papeleria.shape)
tabla = papeleria.reshape(-1, 3)
print("tabla:", tabla.shape)
# Comprobación: con for, el total no cambia
total_for = 0
for sucursal in [centro, norte]:
for dia in sucursal:
for venta in dia:
total_for = total_for + venta
assert tabla.shape == (14, 3), "La tabla debería ser 14 renglones (sucursal y día) × 3 productos"
assert tabla.sum().item() == total_for == 23100, "Cambiar de forma no cambia el total"
print("Total:", tabla.sum().item(), "| con for:", total_for)
Изход:
papeleria: torch.Size([2, 7, 3])
tabla: torch.Size([14, 3])
Total: 23100 | con for: 23100
Редове от 0 до 6 са Centro; от 7 до 13 — Norte. Общата сума, 18 500 + 4600 = 23 100, не се промени. Какво се загуби? Това, че ред 7 е „Norte, понеделник“, вече не го казва формата; на практика се добавят колони като „клон“ и „ден“.
Ортега поглежда двете числа: 18 500 и 4600.
— Тази разлика ни накара да се загледаме в Norte — казва. — Системата ни видя странни такси на терминала Ви. Онова, което не видя, е това, което Вие току-що ми показахте: че зад тях няма стока.
Стъпка 5 — Магазинът, който ти препоръчва: речникът, който се учи сам
Телефонът на доня Лупе звънва. Известие от онлайн магазин: „Може би ще ти хареса и: комплект за геометрия“.
— А това откъде знае, че продавам комплекти за геометрия?
Ортега и Матео се споглеждат. Този въпрос има отговор.
Зад „може би ще ти хареса и…“ често има embedding. Facebook (днес Meta) публикува през 2019 г. модел за препоръки с отворен код в PyTorch (DLRM), където „кой продукт е“ минава през таблици от embedding-и. Alibaba публикува същата година такъв, който чете последователността от онова, което един потребител е разгледал и купил; според компанията работи в магазина ѝ Taobao.
Помисли за речник на Python: {"cuadernos": [1.5, -0.3, -2.2], ...}, списък с числа за продукт. Разликата е, че тези числа не ги пише никой: моделът ги учи сам, както научи теглата на детектора, и те се нагласяват с данните и загубата. В задача за препоръки продукти със сходни модели на купуване могат да получат близки числа, но не е автоматично правило.
Embedding е речник, който се учи сам. В PyTorch ключът е цяло число, така че първо номерираш каталога си. Създай embedding.py:
import torch
torch.manual_seed(0)
# El catálogo: cada producto tiene un número
catalogo = {"cuadernos": 0, "plumas": 1, "mochilas": 2, "colores": 3, "tijeras": 4}
# La tabla de embeddings: 5 productos, 3 números por producto
diccionario = torch.nn.Embedding(5, 3)
print("tabla completa:", diccionario.weight.shape)
# Una clienta compró cuadernos, mochilas y otra vez cuadernos
compra = torch.tensor([catalogo["cuadernos"], catalogo["mochilas"], catalogo["cuadernos"]])
print("entrada:", compra.shape, compra.dtype)
salida = diccionario(compra)
print("salida:", salida.shape)
print(salida)
assert salida.shape == (3, 3), "3 productos comprados × 3 números por producto"
assert torch.equal(salida[0], salida[2]), "El mismo producto da el mismo renglón"
assert torch.equal(salida[1], diccionario.weight[2]), "Buscar un producto es sacar su renglón"
print("Forma y valores cuadran")
# Un lote: 2 clientas, 4 compras cada una
historiales = torch.tensor([[0, 1, 1, 3],
[2, 4, 0, 0]])
print("historiales:", historiales.shape, "->", diccionario(historiales).shape)
Изход:
tabla completa: torch.Size([5, 3])
entrada: torch.Size([3]) torch.int64
salida: torch.Size([3, 3])
tensor([[ 1.5410, -0.2934, -2.1788],
[ 0.4033, 0.8380, -0.7193],
[ 1.5410, -0.2934, -2.1788]], grad_fn=<EmbeddingBackward0>)
Forma y valores cuadran
historiales: torch.Size([2, 4]) -> torch.Size([2, 4, 3])
torch.equal(a, b) отговаря True само ако двата тензора имат една и съща форма и едни и същи стойности. Затова двата assert проверяват, че търсенето на един и същ продукт дава същия ред.
Прочети го бавно:
Embedding(5, 3)е таблица с 5 реда (по един за продукт) и 3 колони, първоначално с случайни числа.- Търсенето на продукт е вадене на неговия ред: cuadernos се появява два пъти, идентичен.
grad_fnе PyTorch, който предупреждава, че следи сметката, за да може да нагласи тези числа при обучение. Това е частта „учи се сам“.- Правилото за формата: изходът е формата на входа плюс една ос накрая, с размера на второто число на Embedding.
(3,)→(3, 3);(2, 4)→(2, 4, 3).
Този последен ред е учебният модел на Nubank: с един токен за покупка (клиенти, покупки) от цели числа става (клиенти, покупки, числа). В реалния случай една покупка може да даде няколко токена и осът би била тази на токените. Историята на покупките ти се чете като текст.
— Тоест магазинът не знае, че продавам комплекти за геометрия — казва доня Лупе. — Знае, че хората, които купуват каквото купувам аз, купуват и това.
— Точно, лельо.
— Ами тогава е по-клюкарски от кумата ми.
Ако поискаш продукт, който го няма в таблицата (5, когато има само от 0 до 4), излиза:
IndexError: index out of range in self
Стъпка 6 — Мексико и предпазните мерки, които не са по желание
10:05 сутринта. Ортега поглежда часовника. Минал е с пет минути над двайсетте и не изглежда да го интересува.
— Сега ще Ви кажа нещо, което не Ви казах по телефона — казва. — Съобщението, което получи леля Ви на 1 ноември, го изпрати машина. Една система видя странни такси и спря терминала. Сама.
Доня Лупе стиска чантата.
— И защо ми дадоха срок до днес?
— Защото машината може да маркира. Но такова решение не бива да остава в машината. Някой трябва да провери. Днес този някой съм аз.
Матео разбира изведнъж защо седи там. Не е дошъл да убеждава модел. Дошъл е, за да прегледа човек онова, което моделът е решил.
Следва защо това „някой трябва да провери“ не е любезност на банката.
Banxico. Банката на Мексико публикува на 10 юни 2026 г. каре „Изкуственият интелект и финансовата стабилност: потенциални канали за предаване на рискове“, където предупреждава за концентрацията при малко доставчици, за непрозрачни модели, които трудно се наблюдават, и за възможното неоправдано изключване на определени групи от населението. Коментира го и бележка на Expansión от 18 юни 2026 г.
Пристрастието: German Credit. Публична база, много използвана за упражнения по кредитиране, от хранилището на Калифорнийския университет в Ървайн: 1000 души с по 20 стойности, от 1994 г. Като оригинална таблица X има 1000 души и 20 смесени атрибута (числа и категории); преди да се ползва в числов тензор, категориите трябва да се кодират и тогава осът на стойностите може да престане да е 20. Проблемът е в колоните: една смесва семейно положение и пол, друга е възрастта и друга казва дали човекът е „чуждестранен работник“. Да обучаваш с това така, както е, значи да искаш от модела да отпуска или не според пола или националността. Затова курсът не я ползва в сесия 7.
А ако изтриеш тези колони? Не стига: други могат да издадат същата стойност. Все едно да махнеш името от един изпит и да оставиш почерка: учителят пак знае чий е. Трябва да се мери как моделът третира всяка група.
Европейският закон. AI Act на Европейския съюз, Приложение III, точка 5(б), поставя като висок риск системите, които преценяват дали един човек е добър за кредит или му дават кредитен рейтинг, освен тези, които откриват финансови измами. Твоят детектор би останал отвън; модел, който оценява кредит, като тези, с които се упражнява върху German Credit, вътре. Да помислим: защо законът третира различно измамата и кредита? Подсказка: ако детекторът сгреши, блокират ти една покупка; ако сгреши този за кредита, оставаш без къщата.
Мексиканският закон. Новият Федерален закон за защита на личните данни, държани от частни лица, е публикуван на 20 март 2025 г. Неговият член 26, точка II ти позволява да възразиш срещу това данните ти да минават през автоматизирана обработка, която те засяга съществено и те оценява без човешка намеса: икономическото ти положение, здравето, надеждността или поведението ти, наред с други неща. Преведено: ако един модел решава сам дали ти дават кредит, в тези хипотези можеш да възразиш. Не значи, че законът сам по себе си повелява човешка проверка при всяко решение, а правото има изключения: не се прилага, например, когато обработката е необходима за изпълнение на законово задължение. За този, който проектира, „моделът решава и толкова“ не стига: добре е човек да е по пътя.
Внимание какво казва и какво не казва този член: говори за твоите лични данни, за решения за теб. Терминалът на една книжарница е друга история, а в разказа банката го преглежда на ръка по собствено правило. Но идеята е същата и Матео я видя в кабинета на Ортега: машината маркира; човек проверява; а който е засегнат, има как да обжалва.
10:20 сутринта. Кабинетът на адвокат Ортега.
Ортега въвежда нещо. Принтира лист. Подписва го.
— Терминалът на Norte се активира отново от днес — казва. — Но преди това ще дойде техник. Истински, с пропуск и заповед за обслужване. Ще прегледа устройството.
Доня Лупе мълчи. За първи път от седем седмици няма на ум нито една поговорка.
1:15 следобед. Клон Norte.
Техникът на банката отваря терминала върху тезгяха. Фер стои отстрани, със скръстени ръце. Матео — отзад.
В процепа, където влиза картата, има нещо, което не бива да е там: тънка пластинка, с кабел, дебел колкото косъм, който влиза навътре в устройството.
— Четец — казва техникът. — Копира картата всеки път, когато някой плаща. Хората дори не разбират.
Фер бавно изпуска въздуха.
— Сложил го е онзи със синята тениска. През август.
Никой не го беше викал. Никой не го беше питал за името. Хората плащаха в Norte и картите им се използваха призори, далеч, другаде. Затова банката виждаше само терминала.
Техникът пъха пластинката в найлонов плик. Матео мисли за таблицата с такси от сесия 6: тези без стока зад тях. Ето я ръката, която липсваше.
👉 Ако идваш от бизнес администрацията: когато доставчик ти представи своята ИИ система, задай му трите въпроса от стъпка 1; ако не знае да отговори, не разбира продукта си. Питай откъде идва всяка цифра. А ако системата решава за хора (кредит, застраховки, наемане), питай къде е човекът, който проверява (добре е, дори законът да не го изисква във всички случаи).
Упражнения към сесия 8
Последните от курса. Решенията са в края.
Упражнение 30 — Три случая, три форми. Отговори на трите въпроса на хартия, напиши формата, начертай я с torch.zeros и я провери с assert. Точка а) е решена.
а) Партида от 500 покупки с по 200 стойности, както в бележката на BBVA:
bbva = torch.zeros(500, 200)
assert bbva.shape == (500, 200), "a) compras × datos"
б) Историята на 16 клиенти в последователности от по 100 покупки, всяка покупка прекарана през Embedding с 64 числа, както в учебния модел на Nubank. Подсказка: torch.zeros(16, 100, dtype=torch.long) и torch.nn.Embedding(1000, 64).
в) Един щетен случай с 5 снимки с височина 720 и ширина 1280, в реда на PyTorch.
Завърши с print("Ejercicio 30 superado").
Упражнение 31 — Партидата от снимки. Попълни празните места: един щетен случай с 6 снимки 224 × 224 и броят им числа, изчислен по два начина, които трябва да съвпаднат:
siniestro = ____
assert siniestro.shape == ____, "6 fotos × 3 colores × 224 de alto × 224 de ancho"
cuenta = 1
for tamano in (6, 3, 224, 224):
cuenta = ____
assert siniestro.numel() == cuenta, "numel debe dar lo mismo que multiplicar la forma con un for"
print("Ejercicio 31 superado:", siniestro.numel(), "números")
Упражнение 32 — Речникът на доня Лупе. Онлайн магазинът ѝ има 4 продукта и тя иска по 2 числа за продукт. Предвиди формите преди да пуснеш:
torch.manual_seed(1)
catalogo = {"cuadernos": 0, "plumas": 1, "mochilas": 2, "colores": 3}
diccionario = torch.nn.Embedding(____, ____)
historiales = torch.tensor([[0, 1, 1, 2, 3],
[3, 3, 0, 1, 2],
[2, 2, 2, 0, 1]])
salida = diccionario(historiales)
assert diccionario.weight.shape == ____, "4 productos × 2 números"
assert historiales.shape == ____, "3 clientas × 5 compras"
assert salida.shape == ____, "3 clientas × 5 compras × 2 números"
assert torch.equal(salida[0][3], diccionario.weight[catalogo["mochilas"]]), "La cuarta compra de la primera clienta son mochilas"
print("Ejercicio 32 superado")
Упражнение 33 — От последователност към таблица, сам. Малко M5: 100 серии, 28 дни, 3 стойности на ден (цена, промоция, празник). а) Създай с torch.zeros онова, което би видяла мрежа, четяща последователности. б) Преобразувай го с reshape и -1 в таблицата, която би видял LightGBM. в) Напиши три assert: двете форми и че имат еднакъв брой числа. г) В коментар кажи какво е един ред на таблицата и какво формата вече не казва.
Чести грешки (и как да ги забележиш)
| Грешка | Как изглежда | Как да я забележиш | Какво да направиш |
|---|---|---|---|
| Смесване на реда на цветовете | Пишеш (снимки, височина, ширина, 3), а PyTorch очаква (снимки, 3, височина, ширина) |
Гърми assert-ът на формата |
Питай в какъв ред идват снимките |
| Искане на продукт извън таблицата | IndexError: index out of range in self |
Някое число е ≥ първия размер на Embedding | N продукта са от 0 до N − 1 |
| Подаване на десетични числа на Embedding | RuntimeError: Expected tensor for argument #1 'indices' to have one of the following scalar types: Long, Int; but got torch.FloatTensor instead (while checking arguments for embedding) |
Казва FloatTensor, където очаква цели числа |
torch.tensor([0, 2]), без точка |
| Повтаряне на цифра от компания като факт | „Mastercard подобрява откриването с 300 %“ | Източникът е съобщение на самата компания | „Според компанията“ и кажи дали е „до“, или „средно“ |
Самооценка на урок B
Отбележи честно. Ако нещо ти излезе „още не“, върни се към тази сесия.
| Мога да… | Сесия | Да / Още не |
|---|---|---|
Сменям формата с reshape, ползвам -1 и чета грешката, когато не излиза |
5 | |
| Предвиждам формата, която излиза при операция с тензори с различни форми | 6 | |
Различавам * от @ и знам кое да ползвам |
6 | |
| Обяснявам загуба, градиент, оптимизатор и епоха | 7 | |
| Обяснявам защо точността сама подвежда и какво мерят precision и recall | 7 | |
| Чета реален случай и пиша формата на неговия тензор | 8 |
Преговор на урок B
Отговори, без да гледаш. Тези с код — предвиди и после ги пусни.
- Ако
meses = torch.arange(12), каква форма даваmeses.reshape(4, -1)? Аmeses.reshape(-1, 6)? - Какво става с
meses.reshape(5, -1)и защо? - С книжарницата
(2, 7, 3)иprecios = torch.tensor([45.0, 12.0, 350.0]), каква форма имаpapeleria * precios? - Работи ли
torch.zeros(2, 7, 3) * torch.zeros(7)? - С
a = [[1, 2], [3, 4]]иb = [[10, 20], [30, 40]]като тензори, колко даватa * bиa @ b? Защо*е капан, който не дава грешка? - Ако
tablaе(14, 3), аpreciosе(3,), каква форма имаtabla @ preciosи какво е всяко число? - Какво правят
perdida.backward()иoptimizador.step()? - Какво е епоха?
- От 1000 покупки 50 са измама. Моделът вдига 40 тревоги и 30 са наистина измама. Изчисли точност, precision и recall. Кое тревожи най-много банката?
- Напиши формата на: (а) 64 покупки с 4 стойности; (б) 32 клиенти с последните им 30 покупки по 4 стойности; (в) 8 снимки 480 × 640 в реда на PyTorch.
🔁 За затваряне на курса
Сряда, 23 декември, 7:30 вечерта. Книжарница, клон Centro.
Доня Лупе идва с кутия от сладкарница, вързана с панделка. Tres leches. Слага я на тезгяха, между телбодовете и ролките гланцова хартия.
— Тази я платих с карта — казва. — На терминала на Norte. Да видим дали сега ми вземат колкото трябва.
Фер реже тортата. На нея се пада най-голямото парче и никой не казва нищо, защото всички знаят защо: тя беше написала през септември, че липсва стока, и никой не прочете имейла ѝ.
Матео яде прав, облегнат на витрината. Отвън някой спуска метална ролетка. Мирише на нова хартия и на канела.
— А ти какво ще правиш сега? — пита го доня Лупе. — Вече няма какво да се спасява.
Матео го е мислил цяла седмица. През ноември искаше просто да завърши следването. Сега знае какво му харесва: някоя купчина числа да казва кой лъже. Иска да учи това. Данни. Модели. И ситния шрифт.
— Това, лельо. Каквото направихме.
— Да пазиш книжарници?
— Нещо такова.
Тази нощ отваря лаптопа. Нов лист, празен. Все още никаква форма, никаква ос.
Пише един-единствен ред:
# ¿Y ahora qué?
Ти си като него. За осем сесии стигна от едно самотно число до това да четеш как работят банка, застраховател и магазин. Не ти остава формула: остава ти начин да гледаш.
| Сесия | Какво научи |
|---|---|
| 1 | Какво е измерение и какво е форма, със списъци на Python |
| 2 | Първият ти тензор: torch.tensor, shape и dtype |
| 3 | Да вземеш парче от тензора по коя да е негова ос |
| 4 | Да сумираш и усредняваш по ос, сравнено с for |
| 5 | Да сменяш формата с reshape, без да променяш данните |
| 6 | Да работиш с цели тензори и разликата между * и @ |
| 7 | Да обучиш детектор на измами и да не вярваш на точността |
| 8 | Да четеш реални случаи, embedding-и и предпазните мерки при автоматичния кредит |
Решения (не ги гледай, преди да опиташ)
Преговор за начало
(покупки, стойности на покупка): в сесия 7 —(4000, 4).- Мери колко зле предвижда моделът, с едно число; ако спада, моделът се учи.
- Защото почти всички покупки са добри: „детектор“, който никога не вдига тревога, вече познава около 84 %. С 91 % нашият още оставяше да мине 1 от 3 измами.
Упражнения
30. б) (16, 100, 64): клиенти × покупки × числа на embedding-а. 1000 е колко различни продукта се събират в таблицата; не променя формата на изхода. в) (5, 3, 720, 1280).
historiales = torch.zeros(16, 100, dtype=torch.long)
embedding = torch.nn.Embedding(1000, 64)
salida = embedding(historiales)
assert historiales.shape == (16, 100), "clientes × compras"
assert salida.shape == (16, 100, 64), "clientes × compras × números"
fotos_siniestro = torch.zeros(5, 3, 720, 1280)
assert fotos_siniestro.shape == (5, 3, 720, 1280), "fotos × colores × alto × ancho"
print("Ejercicio 30 superado")
Изход: Ejercicio 30 superado.
31. Празните места са torch.zeros(6, 3, 224, 224), (6, 3, 224, 224) и cuenta * tamano. Изход: Ejercicio 31 superado: 903168 números.
32. Embedding(4, 2), (4, 2), (3, 5) и (3, 5, 2): към формата на входа се добавя накрая ос с размер 2. Изход: Ejercicio 32 superado.
33.
series = torch.zeros(100, 28, 3) # series × días × datos
tabla = series.reshape(-1, 3) # (serie y día) × datos
assert series.shape == (100, 28, 3), "series × días × datos"
assert tabla.shape == (2800, 3), "(series y día) × datos"
assert tabla.numel() == series.numel() == 8400, "Cambiar de forma no cambia cuántos números hay"
print("Ejercicio 33 superado")
# Un renglón es un día de una serie; la forma ya no dice de cuál serie ni de cuál día.
Преговор на урок B
Реални изходи на въпроси от 1 до 6:
1) torch.Size([4, 3]) torch.Size([2, 6])
2) shape '[5, -1]' is invalid for input of size 12
3) torch.Size([2, 7, 3])
4) The size of tensor a (3) must match the size of tensor b (7) at non-singleton dimension 2
5) a * b = [[10, 40], [90, 160]] | a @ b = [[70, 100], [150, 220]]
6) torch.Size([14])
(4, 3)и(2, 6):-1значи „изчисли ти“.- Гърми: 12 числа не се разпределят на 5 равни реда.
(2, 7, 3): цените се разтягат към всички клонове и дни.- Не: PyTorch сравнява формите от дясно наляво, а последната ос е 3 срещу 7.
*е клетка по клетка;@— ред по колона. С тези форми и двете работят: ако ползваш грешното, не хвърля грешка, а само дава друго число. Затова се сравнява сfor.(14,): общата сума в песос на всеки клон за всеки ден (количества по цени, сумирани).perdida.backward()изчислява градиентите на загубата спрямо всяко тегло;optimizador.step()ползва тези градиенти, за да премести теглата с малка стъпка и да търси загубата да спадне.- Един пълен преглед на всички данни за обучение.
- Добри покупки без тревога: 1000 − 30 − 10 − 20 = 940. Точност = 970 ÷ 1000 = 0.97; precision = 30 ÷ 40 = 0.75; recall = 30 ÷ 50 = 0.6. 97 % звучи отлично, но се промъкват 4 от всеки 10 измами.
(64, 4),(32, 30, 4)и(8, 3, 480, 640): тензорите от стъпка 1.
Какво следва
Един възможен ред за продължение (на английски, освен последното):
- За интуиция: поредицата Neural Networks на 3Blue1Brown, анимирани видеа, които показват какво прави една мрежа отвътре. Започни с „But what is a neural network?“. Служат за разбиране, не за упражнение.
- За да построиш мрежа от едно-единствено число: Neural Networks: Zero to Hero на Andrej Karpathy. Първото му видео, micrograd (2 часа 25 минути), изгражда от нулата онова, което прави
perdida.backward(); той казва, че стига основен Python и смътен спомен от математиката в гимназията. Върви с темпото на експерт: гледай със спирания. - За по-големи мрежи в PyTorch: Learn PyTorch for Deep Learning на Daniel Bourke (learnpytorch.io), с упражнения и решения за сравнение.
- На испански: видеата на DotCSV за мотивация и, като цел, следдипломният курс Aprendizaje Profundo на UNAM, с отворен материал в GitHub. Ако един ден разбереш тетрадките им, този курс е изпълнил целта си.
Един последен съвет: когато нещо не работи, отпечатай .shape. Ти вече умееш да я четеш.
Пиша от онова, което виждаме всеки ден в Hábil, където изграждаме системи за банки, застрахователи и компании в Мексико. Ако в работата ти или в семейния ти бизнес се сблъскаш с подобен проблем, нека поговорим: habil.mx
Предпочитате имейл? Пишете ни на hola@habil.mx