为了解决这个问题,我们探索了机器学习和序列学习在配方优化中的应用,旨在提升产品质量。我们将实验设计(DOE)与机器学习相结合,从11种候选成分中筛选出最佳的一、二或三成分组合,并根据组合成分的数量调整每种成分的用量:单一成分0-1种,两种成分0-0.5种,三种成分0-0.33种。在评估了所有12种成分的主要效应后,我们将研究范围缩小到5种关键成分。我们对两种成分的组合应用了全因子设计,同时收集了每种三成分组合在最大剂量下的一个数据点。我们使用空间填充设计进一步分析了三种有前景的组合,以探索完整的参数空间。
随后,研究人员开发了机器学习模型来预测产品质量,并通过序列学习指导后续实验,以优化特定配方组合的模型。该方法仅需不到100次实验室实验即可确定最佳配方,充分证明了机器学习、序列学习和实验设计相结合的有效性,它不仅能减少实验工作量,还能有效识别高性能的原料组合。
大家好。今天,我们将探讨如何利用机器学习、序列学习和实验设计来优化配方。我是 Junaid Mehmood,目前在达能研发中心乌得勒支分部担任工艺技术员。
在正式讨论主题之前,我想先简单介绍一下达能。我们的使命是通过食品为尽可能多的人带来健康。我们拥有多元化的产品组合,专注于健康理念,从当地市场采购原料,秉持可持续发展和创新精神。您可能熟悉我们的大部分全球品牌,例如Activia、AptaMil、Evian和Apro,但我们也拥有庞大的本土品牌市场。
如果您仔细观察,就会发现我们的大部分产品都由食品或食品衍生物组成,当然,也包括水。这意味着我们需要处理大量的配方。在达能,我们在进行配方研发和创新思考时,力求在保持卓越口感的同时,也兼顾产品的营养价值。我们希望根据消费者的需求和喜好,不断进行创新。
这并非易事,因为在食品领域进行创新会面临诸多挑战。首先,消费者的偏好可能每年都在变化。鉴于目前更加注重可持续发展,这意味着我们需要不断创新。
其次,我们需要遵守食品安全法规,这可能导致同一款产品在一个市场行之有效,但在另一个市场却可能不被认可。此外,我们希望我们的产品本身就安全可靠,因为我们的大部分产品都面向婴幼儿,有时甚至面向无法经口进食的患者。
然后,我们希望平衡产品的成本。我们希望尽可能保持最高的质量,因为你可以买到质量非常好的产品,但如果价格太贵,就没人会买了。
鉴于此,通常情况下,我们在进行创新时,产品工作流程大致如下。这套流程相当通用,任何生产食品类产品的公司都会遵循类似的流程。首先,我们会构思新产品,或者进行市场调研,并希望改变现有产品的某些特性。然后,基于此,我们会进行原料选择和工艺选择。
原料选择和加工工艺密不可分。一种工艺可能适用于某种原料,但未必适用于另一种。这是一个循环过程,我们根据原料的营养价值来决定原料和加工工艺。它们是否可持续?就加工工艺而言,我们需要考虑其是否具有可扩展性、效率高,以及我们采用的工艺是否不会增加产品本身的成本。
接下来是原型开发阶段,我们主要在研发中心的实验室进行这项工作。在这里,我们会进行小规模的实验室试验,进行风味分析,优化某些工艺流程,或者重新回到第一步,选择不同的原料。完成这些步骤后,我们会进入中试工厂,考察产品的可扩展性。最后,我们会进行工厂试生产。所有这些步骤完成后,在产品上市前的最后一步是进行保质期和稳定性测试。某些类型的产品需要获得监管部门的批准,但并非所有产品都需要,具体情况取决于产品的类型。
现在,无论是实验室规模、中试规模还是工厂规模,我们对产品的特性描述都基于其感官特性以及其他一些特性,例如粘度等加工性能。这些特性构成了我们的产品特性,我们以此为基础优化工艺流程。
今天我要讨论的项目主要侧重于实验室规模的试验,它包含三个主要部分:原料、工艺和试验本身。如果我们只关注原料和工艺,那么我们关注的重点当然是微量和常量营养素。它们必须是产品的一部分,但产品本身也必须美味可口。
当然,我刚才讨论的是保质期,接下来还有防腐剂和稳定剂,以及增稠剂,这些都能帮助产品……总的来说,当产品进入加工厂时,它们能使其更易于加工。当我们考虑工艺选择时,就需要考虑温度控制、混合、加工速度以及所有其他不同的工艺流程。
这些决定是在进行实验室试验之前预先做出的,或者在我们进行实验室试验时,我们会回到这些成分和选择上,并根据典型产品的具体情况进行更改,使其更合理。
当我们考虑配料时,在测试这些配料时,我们会基于它们的功能性进行测试,例如它们对微量营养素的需求(比如添加某些矿物质或维生素),以及它们的感官特性(例如口感),还有监管要求。基于这些,我们可以确定每种配料的最低和最高用量。然后,在实验室规模的试验中,我们会测试每种配料如何影响产品的特性,这些特性包括:口感、质地和稳定性。
然而,对于任何配方中某些成分的最大限量,通常会受到监管要求的限制,尤其是香精、糖类和防腐剂,因此我们需要严格遵守这些规定……我们需要保持在一定的限量以下。
在这个项目中,我们结合使用了机器学习、序列学习和实验设计(DOE),旨在优化产品的口感和质地。为此,我们研究了11种不同的原料,并希望找到一种单组分、双组分或三组分的组合,以增强产品的口感和质地。
然后我们有七个不同的目标。其中三个是我们希望最小化的响应变量,两个是我们希望最大化的响应变量,其余的则是我们希望保持不变的响应变量,这样即使我们加入这种成分组合,也不会改变这两种特定的分子。
此外,还有一些监管方面的要求,例如,如果只使用一种成分……在这11种成分中,如果我们只添加一种,那么最多只能用1。这里的1在我们术语中代表一个水平,如果我们从实验设计(DOE)的角度来看,这意味着这是我们可以使用的该成分的最大用量。如果我们混合使用两种成分,那么最多只能使用0.5。同样,如果我们混合使用三种成分,那么最多只能使用0.33。我们需要在这些限制条件下,找出哪三种成分能带来更好的口感或质地。
如果考虑所有可能的组合,两种原料的组合总数为 55 种。那么,如果有三种原料,可能的组合有 165 种,其中只有 11 种组合是可行的。如果把所有组合都算进去,总共有 231 种组合。要对每一种组合都进行实验,工作量实在太大了。你不可能……也许你得花三四年时间才能得出结论,但这显然不是理想的做法。
为此,我们设计了一种循序渐进的方法。首先,我们从11种成分中筛选出5种,筛选过程仅基于其主要效应。然后,从这5种成分中,我们进一步筛选出两种或三种成分的组合,以找出其中效果最佳的组合。接下来,在第三步中,我们选定了两种或三种成分的组合,并进一步确定哪种组合效果最佳。最后,我们进入建模阶段,利用模型预测结果来确定特定组合中每种成分的最佳用量。我们将详细介绍每个步骤。
对于因子筛选,我们目前采用的是逐个因子进行筛选的方法。虽然在实验设计(DOE)课程中,我们通常不建议这样做,但在这个特定案例中,我们无法进行筛选设计。原因在于筛选设计本身存在一些固有的假设,即每个因子都可以独立于其他因子进行改变,并且每次实验中所有因子都存在。然而,我们的案例并非如此。我们不能像其他方法那样,将四五种成分混合在一起。这意味着我们只能专注于一种成分。
其次,当我们考虑筛选设计建模时,我们通常只构建一个模型并查看参数值。但在这个特定案例中,这样做行不通,因为一旦我们添加更多成分,就会偏离项目目标。
最后,我们在这个阶段没有考虑任何相互作用。首先,这只会大幅增加实验次数。其次,食品配方和口腔对相互作用的感知方式与通常的加工条件截然不同。根据添加剂量,它们之间可能存在协同作用,也可能相互抑制。我们已经知道其中会存在一些非线性效应,因此在这个阶段考虑这些效应毫无意义。
如果我们一次只考虑一个因素,那么在这个例子中,我们分别在三个不同的水平上进行了实验:0.33、0.67 和 1。基于此,我们总共进行了 33 次实验,当然,其中有很多重复。但在整个演示过程中,当我重点讨论处理或实验时,我不会将重复实验包含在内。在这个例子中,我们有 33 次独立的实验。
完成这些实验室试验后,我们会根据每个响应的期望值构建一个相关矩阵。右侧的内容只是为了帮助您更好地理解。对于其中三个响应,我们希望将其最小化;对于其中两个,我们希望将其最大化;而对于另外两个,我们希望保持不变。
这是相关性热图。X 轴代表所有成分,Y 轴代表所有响应值。正如右上角所示,我们想要最小化其中三个响应值,可以看到,它们确实被最小化了。现在,我们需要确定哪个响应值最佳。接下来,我们希望最大化 Y₄ 和 Y₅,而 Y₆ 和 Y₇ 保持不变。
但相关性只能说明一半的问题,因为即使第一层或第三层的响应值变化不大,也可能得到非常好的相关性。因此,我们也查看了协方差热图。协方差实际上告诉我们响应变量相对于成分变量单位变化的相对变化。
结合这两方面的信息,我们能够从总共 11 种成分中剔除 6 种。如果我们只观察剩下的成分,会发现我们想要最小化的三个响应变量与它们之间存在很强的负相关性。这意味着我们想要最大化的响应变量要么没有增加,要么已经达到了最大化。至于其余的 Y₆ 和 Y₇,在本例中,它们的相关性并不强。这意味着它们保持不变。
这就是我们最终的决定。第一步,我们将配料从11种减少到5种。接下来,为了方便起见,我暂且把它们称为1-5。它们和最初的1-5种配料有所不同,但为了方便接下来的讨论,我还是把它们称为X₁到X₅。
现在,我们想要评估所有可能的组合,并找出效果最佳的组合。我们有两种原料。如果考虑三种原料的组合,就有10种组合,也就是10种。总共有20种组合。如果我们现在想对主要二次效应和交互效应进行全因子设计,那将产生330次不同的运行。这已经太多了。
然后我们还有各个组成部分,这样一来总共就有了340个重复项,也就是说,我们不想做这么多实验。这会耗费太多时间和资源。
为了解决这个问题,我们决定设计双因素实验,即只考虑两种成分,然后将所有数据合并,得到三因素组合的设计矩阵。接下来我会详细解释它的结构。对于双因素实验,我们可以使用最大水平0.5;对于三因素实验,我们将使用最大水平0.3。如果我们现在只考虑一个特定的组合X₁、X₂、X₃,那么我们可以合并来自X₁、X₂、双因素组合X₁、X₃以及X₂、X₃的所有数据。这意味着我们不必为所有三因素组合分别进行实验。
如果我们更详细地分析一下某个特定的组合,其方法如下。首先,我们使用空间填充设计来构建双因子组合,并将其视为 0 到 0.5 之间的连续矩阵。然后,我们对三因子设计也进行了同样的操作,但这次我们将其视为 0 到 0.33 之间的连续矩阵。接着,我们将所有双因子和三因子运行的这些处理结果合并到一个表格中。最后,我们使用 JMP 自定义设计模块中的协变量因子函数来得到最终的设计。
让我们详细了解一下每个步骤。第一步,正如我之前所说,我们针对双因子组合创建了 30 个不同的运行。这就是我们的参数空间。当然,它是一样的。只有 X 和 Y 变量在 X₁ 和 X₂、X₁ 和 X₃ 以及 X₂ 和 X₃ 三种情况下发生变化。我们试图在这个特定情况下探索所有的参数空间。然后,我们对三因子组合做了同样的操作,但这次我们的最大限制是 0.33,并且我们再次使用了空间填充设计。
现在我们可以把所有这些运行结果合并到一个表格里。如果我们把这些结果可视化,就能看到这120次运行的整体情况。可以看到,表格的两侧是双因素运行结果,中间部分(用红点标出)是三因素运行结果。双因素运行结果的范围是0-0.5,三因素运行结果的范围是0-0.33。
然后我们可以打开 JMP 的自定义设计模块,并选择“协变量因子”按钮。我们可以选择包含所有不同值的三列。然后,我们在这里为自定义模块选择的模型将包含主效应、二次效应和所有交互效应。
然后我们尝试了不同的运行次数(16、19、22),并将它们相互比较,进行设计评估,以找出从这120次可能的运行中获得最佳设计所需的最少运行次数,从而得到这个模型。我们发现,该设计确实能提供良好的最优性准则,并且模型中不同项之间的相关性非常小。
仔细观察,它与全因子设计非常相似,因为我们墙上的点(在本例中是双因子组合)分布在角落里。然后,设计又增加了两个点来表示三因子组合。然而,设计还增加了中心点。这是我们意识到在这种情况下可以使用全因子设计的第一个线索。事后看来,也许我们应该从这里开始,但我只是在描述我们的工作流程。
因为它看起来像是全因子设计,所以我们实际上就回到了这里。现在大家都知道,如果是全因子设计,设计矩阵看起来是这样的,在这个例子中,最大值是0.5。如果是全因子设计,有三种组合,设计矩阵看起来是这样的。
但是,正如我之前讨论过的,全因子设计还有一个额外的点,我们自己也加入了这个点,那就是三因子组合的最大限制。
在本例中,这些实验对于交互作用和二次效应至关重要。这些实验中,每个因素只改变一个变量。但我们在第一步中已经进行过这些实验,考察了主效应。因此,我们无需重复这些实验,只需在此基础上扩充数据即可。这意味着在第二步中,我们只需要针对特定成分进行实验,即改变两种或三种成分。这大大减少了实验总数。原本需要 340 次实验,现在只需 60 次即可完成,并且我们可以同时评估所有 20 种不同的组合。
至关重要的是,如果全因子设计是正交的,那么在这个特定案例中,正交性并不存在。这意味着我们在进行分析时需要牢记这一点。
第二步的运行次数减少到仅 50 次。在对所有可能的组合都进行完所有运行后,我们进行了多目标评估,即计算与目标值的距离度量。我们的目标值是 Y₁、Y₂、Y₃、Y₄ 和 Y₅。我们希望最小化、最大化,并保持其中两个值不变。然后,基于这个不同的度量,我们找出哪些组合最接近目标值,哪些组合与目标值相差甚远。
我们筛选出最接近目标的前 10 个运行结果,并找出其中最常见的分子组合。这些组合大致如下所示。我们找到了两种分子组合和三种分子组合,它们最接近我们的项目目标。
尽管我们知道这个模型在这里效果不佳(数据量不足,且不存在正交性),但我们仍然想看看模型在每种组合下的表现。对于我刚才描述的这五种组合,以下是双因子和三因子组合的 R² 值。
在这个模型中,我们有主效应、交互效应和二次效应。如果我们只关注其中一种双因素组合,这张图会显示实际的p值。我们注意到,对于某些响应变量,p值……没有参数显著。对于某些响应变量,部分参数显著,但这些参数在不同的响应变量中并不相同,即使在这种情况下我们获得了较高的R²值。这是意料之中的,因为我们的数据集有限,而且我们的模型可能存在过拟合。
三因素组合的情况也类似。但我们发现,对于三因素组合,至少有一到两个参数对所有响应都显著。然而,并非所有参数都相同,并非所有参数对所有响应都显著。这基本上是我们得出的第一个线索:每个参数都需要单独建模。对于每个参数,我们需要找出哪些因素是显著的。
为了更清楚地说明这一点,接下来,即使使用这个有限的数据集,当我们移除二次效应后,R² 值也变得非常低。这提示我们,二次效应对于某些参数很重要,我们需要将它们纳入模型。在第三步中,在我们考察的五种组合中,现在我们只考虑包含三种成分的组合,因为我们不仅可以很好地对这些组合进行建模,而且我们的因子确实对这些参数有影响。现在我们需要找出哪些因子影响了哪些响应。
为了扩充这些特定组合的数据,我们使用 JMP 的 Augment Design 模块增加了五次运行,并采用了空间填充设计。现在,对于每种组合,我们至少有 20 个边缘数据点,可以基于这些数据点评估模型。但正如我之前强调的,对于每个响应变量,模型都会有所不同。我们可以尝试……对于每个模型,我们都能找到一个不错的模型。但我们没有这样做,而是采用了一种机器学习方法,使用普通最小二乘法、LASSO 和 Elastic Net 对每个响应变量的不同模型进行评估。我们还添加了仅使用线性核和多项式核的支持向量回归。
然后我们使用留一法进行交叉验证。如果您不了解留一法,简单来说,就是先用除一个数据点之外的所有数据点拟合模型。然后,用这个被舍弃的数据点进行预测,并计算误差。这个过程会重复进行,直到所有数据点都被舍弃。之后,您可以计算均方根误差的平均值。基于这个误差,您可以找出哪个模型是最佳的。这种方法的好处在于,它能有效防止过拟合,因为始终会留出一个数据点用于预测;同时,它又能从有限的数据集中选取足够的数据点来拟合一个良好的模型。
应用此方法后,我们得到了 X₂、X₃ 和 X₄ 组合的良好模型,这些模型的均方误差非常低,R² 值也相当高。由于我们预测该特定组合的能力良好,这表明该特定组合的未解释误差较小。因此,我们选择该特定组合进行后续研究。下图展示了实际值、实验值和预测值之间的对比。可以看出,模型并非绝对真理,但它们足以对该特定组合进行预测。
下一步,我们使用这些模型运行蒙特卡罗模拟。通过蒙特卡罗模拟,我们再次计算……基于响应和距离度量,我们找出了最接近目标值的模拟结果。然后,我们对所有最接近目标值的模拟结果进行聚类,最终得到三个不同的运行结果,我们可以将这些结果带回实验室进行实验。
在这三次运行中,只有一次达到了我们预期的目标。我们成功地最小化了 Y₁、Y₂ 和 Y₃,最大化了 Y₄ 和 Y₅,并保持了 Y₇ 不变。在这一步,我们实际上跳过了 Y₆ 的计算,因为即使经过所有这些运行,我们仍然无法准确预测 Y₆ 的值。
现在回到产品流程,这只是整个过程中的一个步骤。现在,我们已经完成了实验室规模的研发。接下来将进入中试工厂。我们将测试其可扩展性,然后进行工厂生产,以及后续的各项工作。
这就引出了我的总结幻灯片。在这个案例中,我们采用了迭代式的实验设计(DOE)方法,逐步进行,最终仅用了100次实验就找到了最优组合,而传统方法需要500次。然后,我们有效地运用空间填充设计结合机器学习来探索实验空间。最后,我们发现,将机器学习能力与实验设计数据和这种顺序方法相结合,即使最初的假设是错误的,也能找到更好的模型。在此,我谨表示感谢。