用于机器学习的超参数优化 - 贝叶斯优化
#python #machinelearning #deeplearning #nlp

构建机器学习或深度学习模型时,您是否曾经遇到过建立某些参数的困境,这些参数直接影响您的模型,例如您应该堆叠多少层?或每一层应该有多少个单位过滤器?您应该使用什么激活功能?这些体系结构级参数称为 hyperparameters ,在深度学习中起着重要的作用,以制定最佳配置,从而产生模型的最佳性能。
在此博客中,我们将介绍一些概念,描述贝叶斯优化的工作原理以及与随机搜索和网格搜索超参数优化方法相比的速度。

介绍

如今,

算法是人类传统上执行决策过程的代理。当我们自动化这些决策过程时,我们必须递归地询问我们的算法是否按预期行事。如果没有,算法距离最新标准的状态有多远?有时,最佳训练的模型可能不是最好的,因为在验证数据上运行时的错误数量。超参数优化是调整机器学习模型参数以提高其性能的过程。这些不是从数据中学到的,而是由用户手动设置的。例如,如果所讨论的模型是神经网络(NN),则用户可以设置NN的学习率,该学习率算作超参数。越来越复杂的机器学习模型通常需要进行更多的参数。这样做的目的是找到导致模型最佳性能的一组超参数。

网格搜索

这种问题的最常见方法之一是网格搜索,其中预定义值集用于训练和评估模型。该过程是为超参数值的每种组合一遍又一遍地训练模型,并选择组合,从而导致模型提供最佳性能。但是,结果是,当超参数的数量和值大小很大时,它可能非常耗时。例如,假设我们有3个超参数,每个参数列出了3个值。它必须处理的组合数将为3 x 3 x 3 = 27。更普遍地,如果'm'是要优化的超参数的数量,并且每个列表中包含n个值,则组合的数量将是
< < < m n m^n , which becomes a problem when the number of samples is very large. We need a more efficient way to reduce the time complexity of this fine-tuning.

随机搜索

随机搜索是另一种方法,其中从预定义的超参数范围中选择随机值。每次训练该模型,并对每组随机值进行评估。它的性能要比网格搜索算法快得多,因为它使用了随机抽样,但是它仍然可能非常耗时,并且可能找不到最好的超参数集。让我们假设一个超vOLUME(多维空间中可行区域的大小的度量) v v_{\epsilon} where a function takes values within 1ϵ 1 - \epsilon of its maximum. The random search then will sample this hypervolume with probability

P(ϵ)=vϵV P(\epsilon) = \frac{v_{\epsilon}}{V}

where 'V' is the total search space volume. If the total search space is given as Rd R^d and the hypervolume spans with rd r^d ('d' being the input dimension), the random search would have to process number of samples in the order of (rR)d \left(\frac{r}{R} \right)^{-d} . If r << R then this becomes really expensive!

贝叶斯优化

为了减轻上述问题,还有另一种称为贝叶斯优化的方法。这是一种替代方法,比网格搜索和随机搜索算法更快,更有效。它使用贝叶斯推断对未知函数进行建模,该函数将参数值映射到模型的性能。这里的主要优点是它使用有关过去迭代的信息来告知下一组迭代。如果您回想起贝叶斯定理,则事件A的条件概率,鉴于事件B已经发生:
给出了:

p a <我的Mathvariant =“ normal”> ‣ b strenty =“ false”>( b) ))<)< /o>

在NLP中,可以使用超参数优化来调整单词嵌入模型的超参数,例如Word2Vec,Glove等。我们可以使用不同的超参数训练嵌入模型,并评估基本NLP任务的性能文本分类,命名实体识别,情感分析等。它将很快与其他活跃的学习者一起用作活跃的学习者,例如 bricks 中的随机搜索和网格搜索。由于它是一个活跃的学习者,因此在砖块中没有实时运行时环境。取而代之的是,必须从代码段中复制代码并将其粘贴到炼油厂。在炼油厂中,我们使用句子嵌入(每句话为一个向量)来训练ML模型,这些模型可以从Bert等大语言模型中获得,甚至可以从TF-IDF/BOW等更简单的方法中获得。 Word2Vec/Glove会产生单词嵌入(每个单词一个向量),如果您有兴趣了解单词和阶段之间的关系,它们会更有用。您可以在this博客中的炼油厂中找到有关主动转移学习和应用程序的更多信息。

这是一个示例,该示例显示了针对文本分类任务的贝叶斯优化的实现:

from gensim.models import Word2Vec
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from bayes_opt import BayesianOptimization

def bayesian_optimization(sentences, labels, n_iter=10, cv=5, random_state=42):
    """
    Perform Bayesian optimization to tune the hyperparameters of a word2vec model for text classification.
    """

    def cross_validation_score(dim, window, negative):
        """
        Function to evaluate the performance of the word2vec model on the text classification task
        """
        model = Word2Vec(sentences, vector_size=int(dim), window=int(window), negative=int(negative))
        X = model[model.wv.vocab]  # load the vocabulary
        clf = RandomForestClassifier(random_state=random_state)
        score = cross_val_score(clf, X, labels, cv=cv).mean()
        return score

    optimizer = BayesianOptimization(
        f=cross_validation_score,
        pbounds={
            "dim": (50, 100, 150), 
            "window": (2, 4, 6),
            "negative": (5, 10, 15)  # the hyperparameters used
        },
        random_state=random_state
    )
    optimizer.maximize(init_points=5, n_iter=n_iter)  # maximize the likelihood function
    best_params = optimizer.max["params"]
    best_params["dim"] = int(best_params["dim"])
    best_params["window"] = int(best_params["window"])
    best_params["negative"] = int(best_params["negative"])
    return best_params

得出结论,如果您已经知道哪些超参数效果很好,并且它们的样品空间不太大,那么网格搜索就很棒。如果您不知道超参数可以进行微调,则随机搜索效果很好。由于上述原因,请尽量不要将其用于太大的样本量。贝叶斯优化是一种强大的方法,可以在随机搜索和网格搜索方法上更有效地使用。相比之下,它的速度比网格搜索方法快10倍。它为自然语言处理领域中的许多关键用例服务。凭借其在选择获取功能方面的灵活性,它可以定制为各种问题。

引用:

  1. An active approach to bayesian optimisation
  2. Bayes probability and likelihood
  3. gensim python package