Interview¶
Algorithm¶
不同的二叉搜索树¶
https://leetcode.cn/problems/unique-binary-search-trees/description/
Design¶
1. 手写cross entropy与softmax优化¶
原生softmax很容易溢出,需要使用一些优化操作减少对数和指数的计算。
import torch
import torch.nn.functional as F
b, c = 2, 8
z = torch.randn(b, c) * 1000
y = torch.randint(0, c, (b, )).long()
def cross_entropy_with_logits1(z, y):
p = torch.exp(z) / torch.exp(z).sum(dim=-1, keepdim=True)
print(p)
loss = (- y * torch.log(p)).sum(dim=-1)
return loss
def cross_entropy_with_logits2(z, y):
z = z - torch.max(z, dim=-1, keepdim=True).values
p = torch.exp(z) / torch.exp(z).sum(dim=-1, keepdim=True)
print(p)
loss = (- y * torch.log(p)).sum(dim=-1)
return loss
def cross_entropy_with_logits3(z, y):
z = z - torch.max(z, dim=-1, keepdim=True).values
loss = (- y * (z-torch.log(torch.exp(z).sum(dim=-1, keepdim=True)))).sum(dim=-1)
return loss
print(cross_entropy_with_logits1(z, F.one_hot(y, num_classes=c)))
print(cross_entropy_with_logits2(z, F.one_hot(y, num_classes=c)))
print(cross_entropy_with_logits3(z, F.one_hot(y, num_classes=c)))
print(F.cross_entropy(z, y, reduction="none"))
Reference:
2. 自动微分计算图设计¶
pass
3. 大文件中位数¶
基数排序