Teknologian jakaminen

Mallin karsimisen tietopisteiden kokoaminen

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Mallin karsimisen tietopisteiden kokoaminen

Leikkaaminen onsyväoppimismalliKahta yleistä optimointitekniikkaa käytetään vähentämään mallin monimutkaisuutta ja parantamaan päättelynopeutta, ja ne sopivat resurssirajoitteisiin ympäristöihin.

Leikkaaminen

Karsiminen on tapa pienentää mallin kokoa ja laskentatehoa poistamalla mallista tarpeettomia tai tarpeettomia parametreja. Leikkaaminen jaetaan yleensä seuraaviin tyyppeihin:

1. Painon karsiminen

Painon karsiminen vähentää mallin parametrien määrää poistamalla painomatriisista lähellä nollaa olevat elementit. Yleisiä menetelmiä ovat:

  • Strukturoimaton karsiminen: Poista painomatriisista pienet painot yksitellen.
  • Strukturoitu karsiminen: Poista painot tietyllä rakenteella (kuten kokonaiset rivit tai kokonaiset sarakkeet).

Esimerkki:

import torch

# 假设有一个全连接层
fc = torch.nn.Linear(100, 100)

# 获取权重矩阵
weights = fc.weight.data.abs()

# 设定剪枝阈值
threshold = 0.01

# 应用剪枝
mask = weights > threshold
fc.weight.data *= mask
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

2. Kanavan karsiminen

Kanavien karsimista käytetään pääasiassakonvoluutiohermoverkko , vähentää laskennan määrää poistamalla merkityksettömät kanavat konvoluutiokerroksesta. Yleisiä menetelmiä ovat:

  • Pisteet tärkeydestä: Laske kunkin kanavan tärkeyspisteet ja poista kanavat, joilla on alhaisemmat pisteet.
  • Harvauden perusteella: Lisäämällä harvat regularisointitermit, jotkut kanavat ovat luonnollisesti harvat harjoitusprosessin aikana ja sitten karsitaan.
import torch
import torch.nn as nn

class ConvNet(nn.Module):
    def __init__(self):
        super(ConvNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
    
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        return x

model = ConvNet()

# 获取卷积层的权重
weights = model.conv1.weight.data.abs()

# 计算每个通道的L1范数
channel_importance = torch.sum(weights, dim=[1, 2, 3])

# 设定剪枝阈值
threshold = torch.topk(channel_importance, k=32, largest=True).values[-1]

# 应用剪枝
mask = channel_importance > threshold
model.conv1.weight.data *= mask.view(-1, 1, 1, 1)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

3. Kerrosten karsiminen

Tasojen karsiminen poistaa kokonaisia ​​verkkokerroksia vähentääkseen mallin laskennallista syvyyttä. Tämä lähestymistapa on radikaalimpi ja sitä käytetään usein yhdessä Model Architecture Searchin (NAS) kanssa.

import torch.nn as nn

class LayerPrunedNet(nn.Module):
    def __init__(self, use_layer=True):
        super(LayerPrunedNet, self).__init__()
        self.use_layer = use_layer
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
    
    def forward(self, x):
        x = self.conv1(x)
        if self.use_layer:
            x = self.conv2(x)
        return x

# 初始化网络,选择是否使用第二层
model = LayerPrunedNet(use_layer=False)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18